在我的应用程序中,由于 glib.timeout_add_seconds(),我使用一个函数来显示带有超时的 GtkInfoBars(如 https://stackoverflow.com/a/1309257/406281 所述)。
我知道 glib.timeout_add_seconds() 应该设置一个函数以定期调用,直到该函数返回 False。
我没有那样做,但一切都按预期进行。这非常简单。这是我的代码:
def infobar(self, message, msgtype=gtk.MESSAGE_INFO, timeout=5):
bar = gtk.InfoBar()
bar.set_message_type(msgtype)
bar.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
bar.connect("response", lambda *args: bar.hide())
self.vb2.pack_end(bar, False, False)
label = gtk.Label()
label.set_markup(message)
content = bar.get_content_area()
content.add(label)
label.show()
bar.show()
if timeout:
glib.timeout_add_seconds(timeout, bar.hide)
所以。提问时间。 看看我在最后一行做了什么。简单地说,这样可以吗?第二次调用 bar.hide() 失败后,超时会自行销毁吗?或者我是否积累了额外的绝育超时,这些超时将 [技术上] 每 5 秒唤醒一次,耗尽资源?
作为附录:
如果正如我怀疑的那样,这很糟糕,并且我确实需要返回 False 来破坏超时,我需要一些帮助——我不知道如何使用代码来满足这些要求条件:我需要同时允许多个信息栏,每个信息栏仍保持连接到自己的计时器和按钮响应信号(就像现在的代码一样)或者我需要每个新的信息栏来替换任何上一个(如果不从上一个 InfoBar 继承计时器,我无法弄清楚如何执行此操作——它变得困惑)。
感谢阅读!
最佳答案
关于 bar.hide
被多次调用,我认为这不会发生,因为据我所知,返回一个评估为 False< 的值应该足够了
和 bar.hide
返回 None
这应该足够了。然而,如果你想完全确定,你可以用这样的东西来验证:
import gtk, glib
def callback():
print 'called'
glib.timeout_add_seconds(1, callback)
gtk.main()
在此示例中,回调也返回 None
并且仅被调用一次,正如您从 stdout
的输出中看到的那样。
关于您的最后一个问题,我想说这已经是一种可以接受的方式,即拥有多个信息栏,每个信息栏都有一个单独的计时器。如果我遗漏了什么,请添加更多信息。
关于python - pygtk glib.timeout_add() : How to tell if timer not being destroyed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8982843/