libnotify の Python バインディングである pynotify を使用してプログラムを作成しようとしています。ある時点で重要な通知を表示し、ユーザーがクリックするまで、情報の変更に応じて数秒ごとに更新したいと考えています。これは、ユーザーがそれを閉じたときに何が起こるかを処理することを除いて、すべて機能します。
通知を更新するには、 のNotification.show
後に呼び出す必要がありますNotification.update
。それは問題ありませんが、ユーザーが通知を閉じたかどうかを追跡する必要があることを意味します。そうしないと、再びポップアップし続けるだけです。
それは、私が考えることができる2つの方法で可能になるはずです:
- 通知が表示されているかどうかを検出します。私はそれを見つける方法を見つけていません。
- 通知が閉じられたときにいくつかの変数を保存し、更新して
Notification.show
再度呼び出す前に確認します。
この 2 番目の方法は可能です。私が見つけたコード例 (pynotify に関する適切なドキュメントはないようです) により、シグナルをコールバックNotification.connect
に接続するために呼び出すことができました。"closed"
私はそれをやろうとしましたが、コールバックは決して発生しませんでした。
私は長い間グーグルでデバッグしましたが、何の進展もありませんでした。最終的に、pynotify に付属するサンプル スクリプトをいくつか見つけました。そのうちの 1 つは、ハンドラーを"closed"
シグナルにアタッチします: test-xy-stress.py
その内容は次のとおりです。
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gobject
import gtk
import gtk.gdk
import pynotify
import sys
import random
exposed_signal_id = 0
count = 0
def handle_closed(n):
print "Closing."
def emit_notification(x, y):
n = pynotify.Notification("X, Y Test",
"This notification should point to %d, %d." % (x, y))
n.set_hint("x", x)
n.set_hint("y", y)
n.connect('closed', handle_closed)
n.show()
def popup_random_bubble():
display = gtk.gdk.display_get_default()
screen = display.get_default_screen()
screen_x2 = screen.get_width() - 1
screen_y2 = screen.get_height() - 1
x = random.randint(0, screen_x2)
y = random.randint(0, screen_y2)
emit_notification(x, y)
return True
if __name__ == '__main__':
if not pynotify.init("XY Stress"):
sys.exit(1)
gobject.timeout_add(1000, popup_random_bubble)
gtk.main()
これを実行したところ、ここのコールバックも起動しないことがわかりました。
これは私のシステムだけでしょうか、それとも pynotify または libnotify のどこかにバグがありますか? これが今すぐ解決できない場合、上記のオプション 1 はどうですか? それを行う方法はありますか?
libnotify 0.4.5 と pynotify 0.1.1 があるようです。