我正在尝试编写一个脚本来检查某些内容,并在出现问题时在托盘中显示通知。在这个例子中,我正在查看文件的年龄。
我似乎无法解决的问题是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()
答案 0 :(得分:1)
您只是在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
。