我想在pygobject的通知中显示一个按钮。单击此按钮应该调用回调,但它没有,我不明白为什么。
这是我的代码:
from gi.repository import Notify, Gtk
class Test:
def __init__(self):
Notify.init('example')
self.notif()
Gtk.main()
def notif(self):
notif = Notify.Notification.new('Title', 'something','dialog-information')
notif.add_action('display', 'Button', self.callback, None)
notif.show()
def callback(self, notif_object, action_name, users_data):
print("Work!")
Gtk.main_quit()
Test()
当我点击“按钮”按钮时,没有任何反应,并且没有调用回调。 有什么问题?
经过一些尝试,我发现当我在Gtk.main()
之后立即放置notif.show()
时,回调工作正常。但我无法使用此解决方案,因为它意味着我以后无法显示其他通知。
答案 0 :(得分:2)
您需要保持对通知对象的引用,直到调用回调:
from gi.repository import Gtk, Notify
class Window(Gtk.Window):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Notify.init('Test')
self.notification = None
self.set_border_width(5)
self.button = Gtk.Button('Test')
self.box = Gtk.Box()
self.box.pack_start(self.button, True, True, 0)
self.add(self.box)
self.button.connect('clicked', self.on_button)
self.connect('delete-event', Gtk.main_quit)
self.show_all()
def on_button(self, button):
if self.notification:
self.notification.close()
self.notification = Notify.Notification.new('Test')
self.notification.add_action('clicked', 'Action', self.callback)
self.notification.show()
def callback(self, notification, action_name):
print(action_name)
win = Window()
Gtk.main()
如果您需要显示更多相同的通知,则需要一个通知对象列表。
有关无窗口示例,请参阅此answer。
答案 1 :(得分:1)
<强>更新强>
似乎你不需要打电话
Gdk.threads_init()
不记得我测试过这种情况,但可能已经发誓这对我来说是不同的。
更新示例:
import sys
from gi.repository import Notify
from gi.repository import Gtk
if not Notify.init('Notification Test'):
print("ERROR: Could not init Notify.")
sys.exit(1)
notification = Notify.Notification.new(
"Notification Title",
"Message...")
notification.set_urgency(Notify.Urgency.NORMAL)
def actionCallback(notification, action, user_data = None):
print("Callback called:"+action)
Gtk.main_quit()
notification.add_action("test-action", "Test Action", actionCallback)
if not notification.show():
print("ERROR: Could not show notification.")
sys.exit(2)
Gtk.main()