pynput не позволяющий tkinter сделать окно - PullRequest
0 голосов
/ 19 января 2020

У меня есть нажатия клавиш чтения pynput, если нажата клавиша Es c, и tkinter показывает их в окне. Оба работают нормально, но в тот момент, когда я помещаю их в один код, ничего не происходит. Вот мой код:

import tkinter as tk
from pynput import keyboard

listen = False

def onpress(key):
    global listen
    if str(key) == 'Key.esc':
        listen = not listen
    if listen:
        if str(key) == 'Key.1':
            labelval.set(labelval.get()+'1')
            print('1')

win = tk.Tk()
labelval = tk.StringVar()
lab = tk.Label(win, textvariable=entryval)
lab.grid(column=0,row=0)

with keyboard.Listener(
    on_press = onpress) as listener:
    listener.join()

Когда я его запускаю, ничего не происходит, окно tk не отображается, а 1 не выводится на экран. Какие-либо предложения? Когда я вынимаю listener.join(), все работает нормально, но тогда не получается keylog

1 Ответ

1 голос
/ 20 января 2020

Вы должны запустить код между with и join() - и использовать mainloop(), чтобы показать окно tkinter

with keyboard.Listener(on_press=onpress) as listener:

    win = tk.Tk()
    labelval = tk.StringVar()
    lab = tk.Label(win, textvariable=labelval)
    lab.grid(column=0,row=0)
    win.mainloop()

    listener.join()

или как минимум mainloop()

win = tk.Tk()
labelval = tk.StringVar()
lab = tk.Label(win, textvariable=labelval)
lab.grid(column=0,row=0)

with keyboard.Listener(on_press=onpress) as listener:

    win.mainloop()

    listener.join()

Вы можете написать это также без with()

listener = keyboard.Listener(on_press=onpress)
listener.start()

win = tk.Tk()
labelval = tk.StringVar()
lab = tk.Label(win, textvariable=labelval)
lab.grid(column=0,row=0)
win.mainloop()

listener.join()

Кстати: вы создали labelval, но вы использовали textvariable=entryval

Вкл Linux Мне пришлось использовать другой метод распознать 1

import tkinter as tk
from pynput import keyboard

listen = False

def onpress(key):
    global listen

    #if key == keyboard.Key.esc:
    if str(key) == 'Key.esc':
        listen = not listen

    if listen:
        if hasattr(key, 'char') and key.char == '1':
            labelval.set(labelval.get()+'1')
            print('1!')

win = tk.Tk()
labelval = tk.StringVar()
lab = tk.Label(win, textvariable=labelval)
lab.grid(column=0,row=0)

with keyboard.Listener(on_press=onpress) as listener:

    win.mainloop()

    listener.join()
...