我正在尝试使用 pynotify(libnotify 的 Python 绑定)编写程序。我想在某个时候提出一个关键通知,并随着信息的变化每隔几秒钟更新一次,直到用户点击它为止。除了处理用户关闭它时发生的事情之外,这一切都有效。
为了更新通知,我需要Notification.show
在Notification.update
. 这很好,但这意味着我需要跟踪用户是否关闭了通知,否则它会再次弹出。
这应该可以通过我能想到的两种方法来实现:
- 检测通知是否可见。我还没有找到任何方法来解决这个问题。
- 在通知关闭时存储一些变量,然后在更新和
Notification.show
再次调用之前检查它。
第二种方法应该是可行的。我发现的示例代码(似乎没有任何适当的 pynotify 文档)导致我调用Notification.connect
将"closed"
信号连接到回调。我试图这样做,但从未触发回调。
我用谷歌搜索和调试了很长时间,但没有任何进展。最终我找到了一些 pynotify 附带的示例脚本。其中一个将处理程序附加到"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。