我是老师。我教数学,但是由于教育正面临人力资源危机,因此我还有其他职责。我教孩子一些编程,他们做得很好。现在,我想和他们一起做蛇游戏,但是在我的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()
我希望窗口与侦听器同时运行。相反,我的代码侦听键盘,然后(在我击落侦听器之后)向上弹出窗口。当我调用mainloop之后调用侦听器时,它会反转,然后首先出现窗口,然后将其击落,侦听器开始工作。
答案 0 :(得分:1)
Listener
是一个线程,因此,如果您加入它,则主线程将等到其结束继续处理。
您可以仅创建一个Listener
对象而无需使用with
语句,该对象将沿着主线程运行(直到回调函数返回False
)
答案 1 :(得分:0)
您不需要Listener
中的tkinter
。您可以使用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