2011-12-17 65 views
19

花了相當一段時間尋找菜單欄的應用程序的方式後,我們接近承認失敗。如何在Python中爲OSX製作菜單欄(系統托盤)應用程序?

我們基本上只是尋找一個關於如何創建一個應用程序的例子/指針,該應用程序將自己置於菜單欄(時鐘旁邊的小圖標)中,並擁有一個菜單。沒有什麼奇特的。

感覺就像應該很容易做的事情,但我們一直沒有找到一個可行的例子。

也許這不可能與Python?有人知道別人怎麼做嗎?

+0

可能是一個相關的問題:http://stackoverflow.com/questions/3104818/cross-platform-python-gui-suitable-for-taskbar-win-and-menubar-mac- functiona – 2011-12-17 13:51:50

+1

[pyObjC](http://pyobjc.sourceforge.net/)怎麼樣? – talonmies 2011-12-17 14:13:47

+0

謝謝talonmies!雖然我安裝時遇到了問題。試過easy_install,但失敗了。然後我下載了源代碼並試圖編譯它(python 2.7.1),但是我得到這個錯誤:error:找不到Requirement.parse('pyobjc-framework-ServiceManagement == 2.4a0')的合適分發。看起來像這可能需要一些工作。 – freeall 2011-12-18 12:55:39

回答

24

一個選項將使用rumps,它提供PyObjC頂層的抽象級別。我專門寫了它來快速生成這些類型的簡單狀態欄應用程序。

我希望這可以幫助幾個人在那裏尋找一個簡單的語義解決方案!

下面是一個簡短的示例代碼片段。裝飾器用於將功能註冊爲點擊事件和定時器的回調。還支持10.8個通知。

import rumps 

class AwesomeStatusBarApp(rumps.App): 
    def __init__(self): 
     super(AwesomeStatusBarApp, self).__init__("Awesome App") 
     self.menu = ["Preferences", "Silly button", "Say hi"] 

    @rumps.clicked("Preferences") 
    def prefs(self, _): 
     rumps.alert("jk! no preferences available!") 

    @rumps.clicked("Silly button") 
    def onoff(self, sender): 
     sender.state = not sender.state 

    @rumps.clicked("Say hi") 
    def sayhi(self, _): 
     rumps.notification("Awesome title", "amazing subtitle", "hi!!1") 

if __name__ == "__main__": 
    AwesomeStatusBarApp().run() 

pic

+0

我試着運行自述文件中的示例代碼,並且除「退出」之外的所有菜單項都被禁用。除非明確添加setAction_,否則菜單項將被禁用。這是預期的行爲? – 2014-07-16 11:12:33

+0

我不得不做'端口安裝py-pip && pip安裝pyobjc rumps'來讓這個例子工作。謝謝! – e40 2015-11-29 16:25:30

12

wxPython將無法添加任務欄項目。您可以通過不使用PyObjC像這樣做:

from AppKit import NSStatusBar 
status_item = NSStatusBar.systemStatusBar().statusItemWithLength_(-1) #NSVariableStatusItemLength 
status_item.setImage_(<NSImage instance to status icon>) 

只是指NSStatusItem類引用做的東西的項目,例如添加菜單,更改高亮圖像等。

+1

謝謝,非常感謝!現在,如果只有我可以安裝PyObjC ... – freeall 2011-12-18 12:30:51

+1

嗨freeall,如果您使用的python 2.6和以上,我認爲easyobinstall的pyobjc將工作得很好,但我建議你不要這樣做 - OSX捆綁與pyobjc(我不確定是否有Lion;如果沒有,可以繼續使用easy_install)。測試你的默認Python,如果它通過導入objc或AppKit安裝它 – maranas 2011-12-18 14:36:44

+0

非常感謝!那是昨天丟失的幾個小時,然後:)我通常使用JavaScript編程(NodeJS),所以我忘記了Python是「包含電池」。 – freeall 2011-12-19 12:30:52

相關問題