Работа с Центром уведомлений Mountain Lion с помощью PyObjC
Я пытаюсь отправлять уведомления Mountain Lion из моего скрипта python и реагировать на клики по уведомлениям. Отправка уведомлений работает отлично найти к настоящему времени. Но все же я не смог заставить Лайона отозвать мой сценарий по щелчку мыши.
Вот что я делаю. Я реализовал класс уведомлений. Единственная цель экземпляра этого класса-предоставлять уведомления, вызывая notify()
. В том же методе я установил объект делегат приложения.
import Foundation
import objc
import AppKit
class MountainLionNotification(Foundation.NSObject, Notification):
def notify(self, title, subtitle, text, url):
NSUserNotification = objc.lookUpClass('NSUserNotification')
NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
notification = NSUserNotification.alloc().init()
notification.setTitle_(str(title))
notification.setSubtitle_(str(subtitle))
notification.setInformativeText_(str(text))
notification.setSoundName_("NSUserNotificationDefaultSoundName")
notification.setUserInfo_({"action":"open_url", "value":url})
AppKit.NSApplication.sharedApplication().setDelegate_(self)
NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)
def applicationDidFinishLaunching_(self, sender):
userInfo = sender.userInfo()
if userInfo["action"] == "open_url":
import subprocess
subprocess.Popen(['open', userInfo["value"]])
Теперь я ожидал, что applicationDidFinishLaunching_()
вызывается по щелчку на уведомлении. К сожалению, этого никогда не происходит. Что я делаю не так?
1 ответ:
Ладно, нашел. Не побежал
AppHelper.runEventLoop()
. Очевидно, ошибка facepalm. Работает следующий код:class MountainLionNotification(Foundation.NSObject, Notification): def notify(self, title, subtitle, text, url): NSUserNotification = objc.lookUpClass('NSUserNotification') NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter') notification = NSUserNotification.alloc().init() notification.setTitle_(str(title)) notification.setSubtitle_(str(subtitle)) notification.setInformativeText_(str(text)) notification.setSoundName_("NSUserNotificationDefaultSoundName") notification.setHasActionButton_(True) notification.setOtherButtonTitle_("View") notification.setUserInfo_({"action":"open_url", "value":url}) NSUserNotificationCenter.defaultUserNotificationCenter().setDelegate_(self) NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification) def userNotificationCenter_didActivateNotification_(self, center, notification): userInfo = notification.userInfo() if userInfo["action"] == "open_url": import subprocess subprocess.Popen(['open', userInfo["value"]])