Tkinter:在主循环中调用事件
我想知道怎么从一个单独的对象里调用 tkinter 的 event
。
我希望能找到类似 wxWidgets 里的 wx.CallAfter
的方法。例如,如果我创建了一个对象,并把我的 Tk
根实例传给它,然后试图从我的对象里调用那个根窗口的方法,我的应用程序就会卡住。
我想到的最好办法就是使用 after
方法,然后从我的单独对象里检查状态,但这样似乎有点浪费。
2 个回答
41
要回答你关于“如何从一个独立对象调用TkInter事件”的问题,可以使用event_generate
命令。这个命令可以让你把事件放入主窗口的事件队列中。结合Tk的强大虚拟事件机制,它就成了一种方便的消息传递方式。
举个例子:
from tkinter import *
def doFoo(*args):
print("Hello, world")
root = Tk()
root.bind("<<Foo>>", doFoo)
# some time later, inject the "<<Foo>>" virtual event at the
# tail of the event queue
root.event_generate("<<Foo>>", when="tail")
需要注意的是,event_generate
这个调用会立即返回。是否这样做符合你的需求还不太清楚。一般来说,你不希望基于事件的程序在等待特定事件的响应时被阻塞,因为这样会导致界面卡死。
不过,我不确定这是否能解决你的问题;如果不看到你的代码,我也不太清楚你真正的问题是什么。例如,我可以在一个对象的构造函数中访问根窗口的方法,而不会导致应用程序锁死。这让我觉得你的代码中可能还有其他问题。
下面是一个成功从其他对象访问根窗口方法的例子:
from tkinter import *
class myClass:
def __init__(self, root):
print("root background is %s" % root.cget("background"))
root = Tk()
newObj = myClass(root)