Как иметь действующие окна и одновременно прослушивать нажатия клавиш и обрабатывать их функцией без нажатия кнопок(сразу после запуска окон)?
Пишу здесь в первый раз, не судите строго. Python. GUI. Tkinter + Keylogger...
Пишу текстовый менеджер, но решил что для безопасности нужно добавить окно TopLevel() с виджетами для ввода пароля, но ввод должен осуществляться с клавиатуры, а виджет звёздочки(всего 6) должен появляться с вводом нового символа с клавиатуры. Загвостка в том, что Keylogger до открытия окна mainloop() останавливает выполнение кода и только прослушивает клавишы, а само окно не появляется. Keylogger после mainloop не работает, так как уже mainloop() останавливает код и пока ты не закроешь окна(или корневое окно), Keylogger не заработает. Так как же мне прослушивать клавишы, обрабатывать нажатия и одновременно иметь функционирующее Tkinter окно, на котором должны появляться звёздочки с вводом пароля
from tkinter import *
from pynput.keyboard import Key, Listener
root = Tk()
root.title("Свёрток")
root.geometry("243x150+0+0")
def show():
room.deiconify()
def hide():
room.withdraw()
def open():
global room
room = Toplevel()
room.title("Текстовый Менеджер")
#room.geometry("1360x768+0+0")
room.geometry("1100x700-0+1")
room.attributes('-fullscreen', False)
def destroy():
room.destroy()
show = Button(root, text="Показать", bg="#555", fg="white", command=show).place(width=121.5, height=75, x=0, y=0)
hide = Button(root, text="Скрыть", bg="#555", fg="white", command=hide).place(width=121.5, height=75, x=121.5, y=0)
launch = Button(root, text="Открыть", bg="#555", fg="white", command=open).place(width=121.5, height=75, x=0, y=75)
destroy = Button(root, text="Закрыть", bg="#555", fg="white", command=destroy).place(width=121.5, height=75, x=121.5, y=75)
defender = Toplevel()
defender.title("Проверка пользователя")
defender.geometry("243x520+0-25")
kolvo = 0
def swes():
global kolvo
kolvo += 1
if kolvo >= 1:
swesda1 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=5, y=38)
if kolvo >= 2:
swesda2 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=45.5, y=38)
if kolvo >= 3:
swesda3 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=87, y=38)
if kolvo >= 4:
swesda4 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=125, y=38)
if kolvo >= 5:
swesda5 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=165, y=38)
if kolvo >= 6:
swesda6 = Label(defender, bg='#555', fg='black', text="*", font=('Arial', 30)).place(width=40.5, height=30, x=200, y=38)
Enter = Button(defender, bg="#555", fg="black", text="Enter", font=("Arial", 14), command=swes).place(width=243, height=30, x=0, y=490)
tesk = Label(defender, bg="#555", fg="black", text="Введите 6-значный пароль", font=('Arial', 14)).place(width=243, height=30, x=0, y=0)
label = Label(defender, bg='#555', fg='black', text='', font=('Arial', 40), borderwidth=2, relief='ridge').place(width=243, height=40, x=0, y=30)
root.mainloop()
def on_press(key):
print(str(key))
with Listener(on_press=on_press) as listener :
listener.join()