Tkinter:在主循环中调用事件
-
06-07-2019 - |
题
如何从单独的对象调用tkinter 事件
?
我正在寻找像wxWidgets wx.CallAfter
之类的东西。例如,如果我创建一个对象,并将其传递给我的 Tk
根实例,然后尝试从我的对象调用该根窗口的方法,我的应用程序将锁定。
我能想到的最好的方法是使用之后的
方法并从我的单独对象中检查状态,但这似乎很浪费。
解决方案
要回答您的“如何从单独的对象调用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
调用将立即返回。目前尚不清楚这是不是你想要的。一般来说,您不希望基于事件的程序阻止等待对特定事件的响应,因为它将冻结GUI 。
我不确定这是否能解决你的问题;没有看到你的代码,我不确定你的真正问题是什么。例如,我可以在传入根的对象的构造函数中访问root的方法,而不会锁定应用程序。这告诉我你的代码中还有其他东西。
以下是从其他对象成功访问根窗口上的方法的示例:
from tkinter import *
class myClass:
def __init__(self, root):
print("root background is %s" % root.cget("background"))
root = Tk()
newObj = myClass(root)
不隶属于 StackOverflow