将Tkinter mainloop与另一个事件监听器相结合

时间:2017-02-07 23:26:43

标签: python events tkinter infinite-loop

我正在尝试构建一个侦听某些键组合的程序,然后在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的mainloop来做这个,我无法弄清楚如何与PumpMessages()一起运行,因为它也会停止类似于mainloop()的代码。

我尝试在root.after()中运行root.mainloop(),我尝试重新创建root.mainloop,如下所示:

def mainloop():
    root.update()
    root.after(50, mainloop)

然后在PumpMessages之前运行它,但这些解决方案都不起作用。它似乎也不能在一个线程中运行PumpMessages或root.mainloop,尽管我可能无法正确执行。如果使用Tkinter是不可能的,那么我是否可以使用可以使用的备用Python GUI?

1 个答案:

答案 0 :(得分:0)

您无需创建使用mainloop()的函数,只需将mainloop()放在代码的底部即可。如果您想延迟,请使用root.after(milliseconds, function)

另外,请务必将mainloop()放在PumpMessages()

之前

e.g。

def mainloopfunction():
    mainloop()

root.after(5000, mainloopfunction)

希望我能帮忙!