0

我正在尝试编写一个脚本来检查某些事情并在出现问题时在托盘中显示通知。在此示例中,我正在查看文件的年龄。

我似乎无法弄清楚如何在 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()
4

1 回答 1

3

您只是在构造函数中检查文件的年龄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.

于 2012-07-31T09:35:36.243 回答