19

您如何event从单独的对象调用 tkinter?

我正在寻找类似 wxWidgets 的东西wx.CallAfter。例如,如果我创建一个对象,并将我的Tk根实例传递给它,然后尝试从我的对象调用该根窗口的方法,我的应用程序就会锁定。

我能想到的最好的办法是使用该after方法并从我的单独对象中检查状态,但这似乎很浪费。

4

2 回答 2

37

要回答“如何从单独的对象调用 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

我不确定这是否能解决您的问题;没有看到你的代码,我不确定你真正的问题是什么。例如,我可以在传入根的对象的构造函数中访问根的方法,而不会锁定应用程序。这告诉我你的代码中还有其他事情发生。

这是从其他对象成功访问根窗口上的方法的示例:

from tkinter import *

class myClass:
    def __init__(self, root):
        print("root background is %s" % root.cget("background"))

root = Tk()
newObj = myClass(root)
于 2008-11-09T16:26:28.640 回答
6

下面只是一些文档和链接,以更好地理解上面布莱恩的回答。

New Mexico Tech的功能说明:

w.event_generate(sequence, **kw)

此方法导致事件在没有任何外部刺激的情况下触发。对事件的处理与由外部刺激触发一样。序列参数描述要触发的事件。您可以通过提供关键字=值参数来设置事件对象中选定字段的值,其中关键字指定事件对象中字段的名称。

tcl/tk 事件属性的列表和描述here

于 2016-04-21T19:25:28.033 回答