当前位置: 首页 > 面试题库 >

Tkinter:在主循环中调用事件

包永新
2023-03-14
问题内容

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

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

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


问题答案:

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


 类似资料:
  • 我有以下代码: 这里的主要循环是: 但是我不确定这是最好的方法(如果我想输入什么,这是行不通的) 然后我试了这个: 但正如我所意识到的,这并不像我预期的那么快。所以问题是:创建主循环的最佳方法是什么?

  • 问题内容: 我一直在慢慢学习Tkinter和面向对象的编程,但是我已经将自己编程与此有关。请原谅我对这一观点缺乏批判性思考,但是我已经问过我认识的每个人,谁比我更了解python,所以我们不能在这里找到可行的解决方案。 我有一个正在运行的gui应用程序,它允许用户输入股票代码,为每个代码创建新标签,然后定期更新每个标签。(有点像一个非常基本的电子商务应用程序之类的东西)。我发现没有gui做到这一点

  • 现在我们已经初步了解了libevent的Reactor组件——event_base和事件管理框架,接下来就是libevent事件处理的中心部分——事件主循环,根据系统提供的事件多路分发机制执行事件循环,对已注册的就绪事件,调用注册事件的回调函数来处理事件。 1 阶段性的胜利 Libevent将I/O事件、定时器和信号事件处理很好的结合到了一起,本节也会介绍libevent是如何做到这一点的。   

  • 问题内容: 到现在为止,我以前以:结束我的Tkiter程序,否则什么都不会出现!参见示例: 但是,当尝试该程序的下一步(使球随着时间移动)时,该书正在阅读,并说要执行以下操作。将绘图功能更改为: 并将以下代码添加到我的程序中: 但是我注意到,添加此代码块使之无用,因为即使没有它,所有内容也会显示出来!!! 此时,我应该提到我的书从未谈论过(也许是因为它使用了Python 3),但是由于我的程序无法

  • 问题内容: 我有以下代码: 这里的主要循环是: 但是我不确定这是做到这一点的最佳方法(如果我想输入一些信息,这将不起作用) 然后我尝试了这个: 但是,正如我已经意识到的那样,它并没有达到我的预期。所以问题是:创建主循环的最佳方法是什么? 问题答案: Tkinter为此提供了一个强大的工具,它被称为after。它旨在用作同步睡眠命令,但可以通过调用自身在mainloop内建立一个循环。 之后,是一个

  • 我有一个带有“开始”按钮和进度条的小型GUI测试。期望的行为是: 单击开始 Progressbar振荡5秒 进度条停止 观察到的行为是“开始”按钮冻结5秒钟,然后显示进度条(无振荡)。 以下是我目前的代码: 根据Bryan Oakley提供的信息,我知道我需要使用线程。我试着创建一个线程,但我猜,由于线程是从主线程中开始的,所以没有帮助。 我的想法是将逻辑部分放在一个不同的类中,并从该类中实例化G