如何同时运行pynput.Listener和tkinter.Tk().mainloop()

2024-05-20 20:45:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一名教师。我教数学,但由于教育面临人力资源危机,我有一些额外的职责。我教孩子们编程,他们做得很好。现在我想用他们做一个蛇游戏,但我有一个问题,在我的GUI应用程序中实现多线程。在

我发现了类似的情况,但没有解决办法。比如这里: Using the keyboard to move the character in a maze 在这里: Tkinter.Tk() and threading

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()

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


Tags: thekeyreleaseondef教师数学root
2条回答

Listener是一个线程,因此如果您加入它,您的主线程将一直等到它结束时才继续处理。在

您只需创建一个没有with语句的Listener对象,它将沿着主线程运行(直到回调函数返回False

tkinter中不需要Listener。您可以使用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()

您也可以将功能单独分配给每个键

^{pr2}$

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

相关问题 更多 >