Как иметь действующие окна и одновременно прослушивать нажатия клавиш и обрабатывать их функцией без нажатия кнопок(сразу после запуска окон)?

Пишу здесь в первый раз, не судите строго. 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()

Ответы (0 шт):