温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - How to run pynput.Listener simultaneously with tkinter.Tk().mainloop()
python tkinter window listener pynput

python - 如何与tkinter.Tk()。mainloop()同时运行pynput.Listener

发布于 2020-03-27 11:13:06

我是老师。我教数学,但是由于教育正面临人力资源危机,因此我还有其他职责。我教孩子一些编程,他们做得很好。现在,我想和他们一起玩蛇游戏,但是在我的GUI应用程序中实现多线程时遇到了问题。

我发现了类似的情况,但没有解决方案。就像这里: 使用键盘在迷宫中移动字符 ,这里: Tkinter.Tk()和线程

def on_press(key):
    print('{0} pressed'.format(key))

def on_release(key):
    if key == Key.esc:
        return False

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

root = Tk()
root.mainloop()

我希望窗口与侦听器同时运行。相反,我的代码侦听键盘,然后(在我击落侦听器之后)向上弹出窗口。当我在调用mainloop之后调用侦听器时,它会反转,然后首先出现窗口,然后将其击落,侦听器开始工作。

查看更多

查看更多

提问者
Andrze
被浏览
340
furas 2019-07-03 23:34

你不需要Listenertkinter您可以用于root.bind为事件按下和释放分配功能。

from tkinter import *

def on_press(event):
    #print('on_press: event:', event)
    #print('on_press: keysym:', event.keysym)
    print('{0} pressed'.format(event.keysym))

def on_release(event):
    #print('on_release: event:', event)
    #print('on_release: keysym:', event.keysym)
    print('{0} release'.format(event.keysym))

    if event.keysym == 'Escape':
         print("exist program")
         root.destroy()

root = Tk()

root.bind('<KeyPress>', on_press)
root.bind('<KeyRelease>', on_release)

root.mainloop()

您还可以分别为每个键分配功能

from tkinter import *

def on_escape(event):
    print("exist program")
    root.destroy()

root = Tk()

root.bind('<Escape>', on_escape)
#root.bind('<KeyPress-Escape>', on_press_escape)
#root.bind('<KeyRelease-Escape>', on_release_escape)

root.mainloop()

Tcl / Tk文档中的按键符号:https ://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm