【问题标题】:pygtk glib.timeout_add(): How to tell if timer not being destroyed?pygtk glib.timeout_add():如何判断计时器是否被破坏?
【发布时间】:2012-01-24 06:28:07
【问题描述】:

在我的应用程序中,由于 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,每个 InfoBar 仍然保持连接到自己的计时器和按钮响应信号(现在的代码)我需要每个新的 InfoBar 来替换任何前一个(如果不从前一个 InfoBar 继承计时器,我无法弄清楚如何做到这一点——它会变得混乱)。

感谢阅读!

【问题讨论】:

    标签: python gtk pygtk


    【解决方案1】:

    关于bar.hide 被多次调用,我认为这不会发生,因为据我所知,返回一个被评估为Falsebar.hide 返回None 的值应该足够了应该足够了。但是,如果您想完全确定,可以通过以下方式进行验证:

    import gtk, glib
    
    def callback():
        print 'called'
    
    glib.timeout_add_seconds(1, callback)
    gtk.main()
    

    在此示例中,回调也返回 None,并且只被调用一次,正如您从 stdout 的输出中看到的那样。

    关于您的最后一个问题,我想说这已经是一种可以接受的方式,即拥有多个信息栏,每个信息栏都有一个单独的计时器。如果我遗漏了什么,请添加更多信息。

    【讨论】:

    • 非常感谢@jcollado!至于你的最后两句话:不,你根本没有遗漏任何东西。我喜欢这段代码完成的结果——它做我想要的;我只是不确定代码本身是否还可以。再次感谢。
    【解决方案2】:

    Widget.hide 始终返回 None,glib.timeout_add_seconds 将其视为 False。因此,您的计时器将始终在运行一次后终止。 hide 有可能会被调用两次(当用户单击“确定”并在 5 秒超时时),但这没关系。所以是的,你的代码很好。

    编辑:刚刚意识到一些事情。每次函数运行时,您都会创建一个新的信息栏,然后只隐藏它。不要使用hide,而是使用destroy,以便正确清理。

    ... 或者我需要每个新的 InfoBar 来替换之前的任何一个(如果不从以前的 InfoBar 继承计时器,我无法弄清楚如何做到这一点——它会变得混乱)。

    这不是太复杂;只需重复使用相同的信息栏。记录glib.timeout_add_seconds的返回值,然后在替换信息栏内容的同时,用glib.source_remove杀死之前的定时器。

    在您提供的两种选择(干净的 UI 与确保用户不会错过重要信息)之间存在可用性权衡,但这是另一个主题,可能并不那么重要。

    【讨论】:

    • 啊!惊人的!我是 python 和 gtk 的新手,所以我很感谢你解释 hide vs destroy 。现在有了 glib.source_remove 信息,我有了一个选择。我正在为这个决定而挣扎——你所说的可用性权衡……我不知道。我想找到更多使用信息栏的 gtk 应用程序示例。唔。无论如何,再次感谢约翰内斯!
    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2011-11-20
    • 2018-02-26
    • 2012-02-05
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多