2012-08-30 10 views
8

PythonスクリプトからMountain Lionに通知を送信しようとしていて、通知のクリックに反応しています。通知を送信すると、今すぐ見つかるはずです。しかし、私はライオンにクリックで私のスクリプトを呼び戻すことができませんでした。PyObjCを使用したMountain Lionの通知センターの使用

ここは私がしていることです。私はNotificationクラスを実装しました。そのクラスのインスタンスの唯一の目的は、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_()通知をクリックすると呼ばれるように期待しました。残念ながらそれは決して起こりません。私は間違って何をしていますか?

+0

@ objc.signatureを( "V @^@")'デリゲートメソッドに、成功しませんでした。 – koloman

+0

私は 'MountainLionNotification'オブジェクトをデフォルトの通知センターのデリゲートに設定し、プロトコル' userNotificationCenter_didActivateNotification() 'を実装しようとしました。スティルは成功しない! – koloman

+0

ちょっと、イベントループを開始せずにPythonスクリプト/インタプリタから表示するように通知を受け取ることができましたか?上記のコードを使用して通知を受け取ることさえできないようです。 – GP89

答えて

8

[OK]を見つけました。実行しなかった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"]]) 
関連する問題