没有使用pygobject通知操作调用回调

时间:2015-02-11 18:15:13

标签: python notifications pygobject

我想在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()时,回调工作正常。但我无法使用此解决方案,因为它意味着我以后无法显示其他通知。

2 个答案:

答案 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()