Tkinter:在主循环中调用事件

时间:2008-11-06 22:49:45

标签: python user-interface communication tkinter

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

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

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

2 个答案:

答案 0 :(得分:30)

要回答您的具体问题“如何从单独的对象调用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)

答案 1 :(得分:6)

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

来自New Mexico Tech的功能说明:

w.event_generate(sequence, **kw)

  

此方法会在没有任何外部刺激的情况下触发事件。事件的处理与外部刺激触发的情况相同。 sequence参数描述了要触发的事件。您可以通过提供keyword = value参数为Event对象中的选定字段设置值,其中关键字指定Event对象中字段的名称。

tcl / tk事件属性的列表和说明here