代码之家  ›  专栏  ›  技术社区  ›  joedborg

在python中刷新Gtk.StatusIcon

  •  0
  • joedborg  · 技术社区  · 12 年前

    我正在尝试编写一个脚本,检查某些事情,并在托盘中显示错误通知。在这个例子中,我看到的是一个文件的年龄。

    我似乎不知道如何在gtk.main()运行后更改图标。

    import os, gtk
    from time import time, sleep
    from datetime import datetime
    
    class HeartbeatTrayIcon(object):
        """
        Use GTK to create an object in the system tray
        and manipulate icon shown if there is an issue.
        """
        def __init__(self):
            rx = os.path.getmtime("test")
            self.statusIcon = gtk.StatusIcon()
            if (time() - rx) > (60*60*24):
                self.statusIcon.set_from_stock(gtk.STOCK_CANCEL)
            else:
                self.statusIcon.set_from_stock(gtk.STOCK_APPLY)
            self.statusIcon.set_tooltip("Last heartbeat received at %s" % datetime.fromtimestamp(int(rx)).strftime('%H:%M:%S %d-%m-%Y'))
    
        def tray(self):
            gtk.main()
    
    if __name__ == "__main__":
        i = HeartbeatTrayIcon()
        i.tray()
    
    1 回复  |  直到 12 年前
        1
  •  3
  •   Frédéric Hamidi    12 年前

    您只是在构造函数中检查文件的年龄 HeartbeatTrayIcon ,因此代码只运行一次。

    我建议使用 gobject.idle_add() 注册执行检查的回调函数。当应用程序空闲时(即队列中不存在优先级更高的事件时),将调用该函数:

    import os, gtk, gobject
    from time import time, sleep
    from datetime import datetime
    
    class HeartbeatTrayIcon(object):
        """
        Use GTK to create an object in the system tray
        and manipulate icon shown if there is an issue.
        """
        def __init__(self):
            self.statusIcon = gtk.StatusIcon()
    
        def check(self):
            rx = os.path.getmtime("test")
            if (time() - rx) > (60*60*24):
                self.statusIcon.set_from_stock(gtk.STOCK_CANCEL)
            else:
                self.statusIcon.set_from_stock(gtk.STOCK_APPLY)
            self.statusIcon.set_tooltip("Last heartbeat received at %s" \
                % datetime.fromtimestamp(int(rx)).strftime('%H:%M:%S %d-%m-%Y'))
            return True
    
        def tray(self):
            gobject.idle_add(self.check)
            gtk.main()
    
    if __name__ == "__main__":
        i = HeartbeatTrayIcon()
        i.tray()
    

    顺便说一句,请注意,您的心跳消息似乎并没有达到您想要的效果:它将始终打印文件的修改时间,而不是上次检查的时间。您可能希望存储返回的值 time() 在变量中,并使用它而不是 rx