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ため、コードは 1 回だけ実行されます。

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 に答える