0

我正在为 OS X(通常也在 python 上)开发我的第一个 Python 应用程序,我遇到了这个问题……我当前的脚本解析来自 iTunes 的声音并将其打印到窗口中。看起来像这样

from Cocoa import *
from Foundation import *
from ScriptingBridge import *

class SocialTunesController(NSWindowController):
    testLabel = objc.IBOutlet()

    def windowDidLoad(self):
        NSWindowController.windowDidLoad(self)
        self.updateTrack()

    def updateTrack(self):
        iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")
        current_track_info = "Name: " + iTunes.currentTrack().name() + "\nArtist: " + iTunes.currentTrack().artist() + "\nAlbum: " + iTunes.currentTrack().album()
        self.testLabel.setStringValue_(current_track_info)

if __name__ == "__main__":
    app = NSApplication.sharedApplication()

    viewController = SocialTunesController.alloc().initWithWindowNibName_("SocialTunes")
    viewController.showWindow_(viewController)

    from PyObjCTools import AppHelper
    AppHelper.runEventLoop()

主要问题是如何在轨道发生变化时触发事件,它会自动更新当前窗口中的轨道信息......</p>

4

2 回答 2

2

发生曲目更改时,iTunes 会发布一个分布式通知。你需要注册一个控制器来监听这些通知:

noteCenter = NSDistributedNotificationCenter.defaultCenter()
noteCenter.addObserver_selector_name_object_(theController, 
                                             objc.selector(theController.updateTrack_,
                                                           signature="v@:@"), 
                                             "com.apple.iTunes.playerInfo", 
                                             None)

而且您的updateTrack_()方法需要接受一个参数(除了self),即发布的通知。

于 2013-11-01T21:28:06.247 回答
1

您可以使用 PyObjC 的事件,是否可以接收 iTunes 事件取决于 iTunes 是否发送事件。据我所知,所有 iTunes 状态小部件都会定期轮询 iTunes 曲目是否已更改。

于 2013-11-01T16:24:56.810 回答