您正在寻找的是,NS分布式通知中心 or NS工作空间,这些可可类发布应用程序事件的通知,对于工作区,诸如应用程序启动、驱动器安装等。
要在 python 中执行此操作,您需要PyObjC,它基本上是苹果 cocoa 类的 python 绑定。他们网站上的文档很少,这是有原因的,因为文档基本上与 Apple 文档相同,所以它们只包含 pyobjc api 和 cocoa API 之间的差异。如果您了解目标 c api 是如何转换为 python 的,那么您就可以开始了。检查这里:http://pyobjc.sourceforge.net/documentation/pyobjc-core/intro.html
我在下面提供了一个使用 python 监听分布式通知的示例。下面的代码基本上添加了一个观察者并监听 itunes 通知。您可以遵循类似的结构,但为 NSWorkspace 添加一个观察者。为了弄清楚您应该听什么,有一个应用程序可以显示通过您系统的所有通知。它被称为通知观察者。用它来确定你应该听什么。您还可以将 Objective C 代码转换为 Python。
下面的代码是做什么的
- 定义一个继承自 NSObject 的新类,由 PyObjC 定义
- 定义一个方法,该方法获取实际通知并将其打印出来
- 创建 Foundation.NSDistributedNotificationCenter.defaultCenter 的实例
- 创建 GetSongs 的实例
- 注册一个观察者,向其传递类、收到通知时调用的方法以及要监视的应用程序和事件,即“com.apple.iTunes.playerInfo”
- 运行事件循环,
有一件事会让你感到困惑,访问属性(目标 c 属性)与访问 python 属性的工作方式不同。即在Python中你做的class_name.att
对于Python中的目标c,你必须像函数一样调用它,即从我下面的示例中:song.userInfo()
import Foundation
from AppKit import *
from PyObjCTools import AppHelper
class GetSongs(NSObject):
def getMySongs_(self, song):
print "song:", song
song_details = {}
ui = song.userInfo()
print 'ui:', ui
for x in ui:
song_details[x] = ui.objectForKey_(x)
print song_details
nc = Foundation.NSDistributedNotificationCenter.defaultCenter()
GetSongs = GetSongs.new()
nc.addObserver_selector_name_object_(GetSongs, 'getMySongs:', 'com.apple.iTunes.playerInfo',None)
NSLog("Listening for new tunes....")
AppHelper.runConsoleEventLoop()
这是实际输出的示例...(是的布兰妮摇滚!,不是!;)
song NSConcreteNotification 0x104c0a3b0 {name = com.apple.iTunes.playerInfo; object = com.apple.iTunes.player; userInfo = {
Album = Circus;
"Album Rating" = 0;
"Album Rating Computed" = 1;
Artist = "Britney Spears";
"Artwork Count" = 1;
Genre = Pop;
"Library PersistentID" = 8361352612761174229;
Location = "file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3";
Name = Circus;
PersistentID = 4028778662306031905;
"Play Count" = 0;
"Play Date" = "2010-06-26 08:20:57 +0200";
"Player State" = Playing;
"Playlist PersistentID" = 7784218291109903761;
"Rating Computed" = 1;
"Skip Count" = 1;
"Skip Date" = "2010-06-26 12:20:57 +0200";
"Store URL" = "itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus";
"Total Time" = 192444;
"Track Count" = 16;
"Track Number" = 2;
}}
ui {
Album = Circus;
"Album Rating" = 0;
"Album Rating Computed" = 1;
Artist = "Britney Spears";
"Artwork Count" = 1;
Genre = Pop;
"Library PersistentID" = 8361352612761174229;
Location = "file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3";
Name = Circus;
PersistentID = 4028778662306031905;
"Play Count" = 0;
"Play Date" = "2010-06-26 08:20:57 +0200";
"Player State" = Playing;
"Playlist PersistentID" = 7784218291109903761;
"Rating Computed" = 1;
"Skip Count" = 1;
"Skip Date" = "2010-06-26 12:20:57 +0200";
"Store URL" = "itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus";
"Total Time" = 192444;
"Track Count" = 16;
"Track Number" = 2;
}
{u'Album Rating Computed': 1, u'Album': u'Circus', u'Rating Computed': True, u'Name': u'Circus', u'Artist': u'Britney Spears', u'Track Number': 2, u'Skip Date': 2010-06-26 12:20:57 +0200, u'Library PersistentID': 8361352612761174229L, u'Player State': u'Playing', u'Total Time': 192444L, u'Genre': u'Pop', u'Playlist PersistentID': 7784218291109903761L, u'Album Rating': 0, u'Location': u'file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3', u'Skip Count': 1, u'Track Count': 16L, u'Artwork Count': 1, u'Play Date': 2010-06-26 08:20:57 +0200, u'PersistentID': 4028778662306031905L, u'Play Count': 0, u'Store URL': u'itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus'}