2017-02-07 36 views
1

我正在尝试构建一个程序,用于侦听特定的组合键,然后在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呢?

回答

0

您不需要创建使用mainloop()的功能,只需将mainloop()放置在代码的底部即可。如果你想在它的延迟,使用root.after(milliseconds, function)

另外,记得以前PumpMessages()

例如把mainloop()

def mainloopfunction(): 
    mainloop() 

root.after(5000, mainloopfunction) 

希望我能帮忙!

+0

不幸的是,这是行不通的。如果我把mainloop()放在最后,它永远不会到达,因为代码永远不会经过PumpMessages()。如果我在此处显示后使用,界面在启动主循环后就变得无响应。编辑 - 实际上,它似乎没有达到主循环,所以PumpMessages()必须防止执行它的函数。 –

+0

您是否曾尝试在PumpMessages()前运行主循环() – Jake

+0

呵呵。这似乎工作,虽然代码永远不会到达PumpMessages(),所以不能是键盘记录器的必要组成部分。这并不完全回答这个问题,但我想它是有效的。 –

相关问题