python - pygtk glib.timeout_add() : How to tell if timer not being destroyed?

标签 python gtk pygtk

在我的应用程序中,由于 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/

相关文章:

python - 如何在没有使用 python 的按键事件的情况下在内部更新/重绘 GTK 小部件 (GTKLabel)?

python - 字典中的类型错误

python - python中如何将第一个目录拆分出路径(如home/tom/cat >> tom/cat >> cat)?

c - GTK+ 如何通过提示请求 super 用户

windows - 在 Windows 上编译 GTK+ 应用程序?

python - 如何在 GTK3 中拖放和排序 GtkTreeView?

Python代码简化?一行,添加所有列表

python - 根据主表一列spark.sql验证两列中的数据

python - 在使用 Glade 创建的 Python GTK3 程序中导入 CSS 文件

python - python脚本中的身份验证以root身份运行