gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:55:23 25 4
gpt4 key购买 nike

我是一名老师。我教数学,但由于教育面临人力资源危机,我有一些额外的职责。我教 children 一些编程,他们做得很好。现在我想用它们制作一个贪吃蛇游戏,但我在 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()

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

最佳答案

您不需要 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()

您还可以为每个按键单独分配功能

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


顺便说一句:

如果你想同时运行tkinterpynput那么你必须在join()之前执行

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

root = Tk()
root.mainloop()

#listener.stop()
listener.join()

listener = Listener(on_press=on_press, on_release=on_release)
listener.start()

root = Tk()
root.mainloop()

#listener.stop()
listener.join()

关于python - 如何与 tkinter.Tk().mainloop() 同时运行 pynput.Listener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com