【问题标题】:Tkinter: invoke event in main loopTkinter:在主循环中调用事件
【发布时间】:2010-09-21 04:51:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: python user-interface communication tkinter


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      来自New Mexico Tech的功能描述:

      w.event_generate(sequence, **kw)

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多