我正在尝试构建一个程序,用于侦听特定的组合键,然后在Tkinter窗口中向用户显示信息。要做到这一点,我使用的是像这样一个键盘记录器(简化这个例子):将Tkinter主循环与另一个事件侦听器相结合
from pyHook import HookManager
from pythoncom import PumpMessages
import Tkinter as tk
def on_keyboard_event(event):
label.config(text=event.Key)
root.update()
return True
hm = HookManager()
hm.KeyDown = on_keyboard_event
hm.HookKeyboard()
root = tk.Tk()
label = tk.Label(root, text='Hello world')
label.pack()
PumpMessages()
正如预期的那样,窗口弹出,并显示它们按什么键的用户。但是,我想集成功能来通过与Tkinter窗口交互来显示其他消息,例如通过按下按钮。然而,似乎我需要Tkinter的主循环来做到这一点,我不知道如何与PumpMessages()一起运行,因为它也停止了类似于mainloop()的代码。
我想在一个root.after()运行root.mainloop(),我试图重建root.mainloop像这样:
def mainloop():
root.update()
root.after(50, mainloop)
,然后PumpMessages前右行驶,但这些方法都工作。它似乎也不像你可以在一个线程中运行PumpMessages或root.mainloop,但我可能不会做正确的。如果Tkinter无法实现这个功能,那么是否有可以使用的替代Python GUI呢?
不幸的是,这是行不通的。如果我把mainloop()放在最后,它永远不会到达,因为代码永远不会经过PumpMessages()。如果我在此处显示后使用,界面在启动主循环后就变得无响应。编辑 - 实际上,它似乎没有达到主循环,所以PumpMessages()必须防止执行它的函数。 –
您是否曾尝试在PumpMessages()前运行主循环() – Jake
呵呵。这似乎工作,虽然代码永远不会到达PumpMessages(),所以不能是键盘记录器的必要组成部分。这并不完全回答这个问题,但我想它是有效的。 –