如何用Python为OSX制作菜单栏(系统托盘)应用?

25 投票
3 回答
14615 浏览
提问于 2025-04-17 08:33

我们花了很多时间在寻找如何制作一个菜单栏应用的方式,现在快要放弃了。

我们其实只是想找一个例子或者指引,教我们怎么创建一个可以放在菜单栏里的应用(就是时钟旁边的小图标),并且有一个菜单。其实没什么复杂的。

感觉这应该是很简单的事情,但我们一直找不到一个能用的例子。

也许用Python做这个不行?有没有人知道别人是怎么做到的?

3 个回答

0

其实,你可以使用wxPython。你可以看看我在这里的相关回答:如何在Mac OSX上使用wx设置菜单栏图标

12

wxPython无法添加任务栏项目。你可以使用PyObjC来实现,方法如下:

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

只需参考NSStatusItem类的说明,就可以对这个项目进行操作,比如添加菜单、改变高亮显示的图像等等。

38

一个选择是使用 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

撰写回答