【问题标题】:How to make an menu bar (system tray) app for OSX in Python?如何在 Python 中为 OSX 制作菜单栏(系统托盘)应用程序?
【发布时间】:2011-12-17 12:50:02
【问题描述】:

在花了相当长的时间研究菜单栏应用程序的方法之后,我们差点认输。

我们基本上只是在寻找有关如何创建将自身置于菜单栏(时钟旁边的小图标)并具有菜单的应用程序的示例/指针。一点都不花哨。

感觉应该是很容易做到的事情,但我们一直没能找到一个可行的例子。

也许用 Python 是不可能的?有谁知道别人是怎么做的吗?

【问题讨论】:

  • 可能是相关问题:stackoverflow.com/questions/3104818/…
  • pyObjC 怎么样?
  • 感谢 talonmies!我在安装它时遇到问题。尝试了easy_install,但失败了。然后我下载了源代码并尝试编译它(python 2.7.1),但我收到此错误:错误:找不到适合 Requirement.parse('pyobjc-framework-ServiceManagement==2.4a0') 的分布。看起来这可能需要一些工作。
  • 发现了!不应该安装它。 Python 已经有了。

标签: python macos menubar


【解决方案1】:

一个选项是使用rumps,它在 PyObjC 之上提供了一个抽象级别。我是专门为快速生成这些类型的简单状态栏应用而编写的。

我希望这可以帮助一些正在寻找简单的语义解决方案的人!

下面是一个简短的例子 sn-p。装饰器用于注册函数作为点击事件和计时器的回调。还支持 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()

【讨论】:

  • 我尝试运行自述文件中的示例代码,除“退出”之外的所有菜单项都被禁用。除非我明确添加 setAction_,否则菜单项将被禁用。这是预期的行为吗?
  • 我必须执行port install py-pip && pip install pyobjc rumps 才能使示例正常工作。谢谢!
【解决方案2】:

wxPython 将无法添加任务栏项目。您可以像这样使用 PyObjC 来做到这一点:

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

只需参考 NSStatusItem 类参考来对项目进行处理,例如添加菜单、更改高亮图像等。

【讨论】:

  • 您好,freeall,如果您使用的是 python 2.6 及更高版本,我认为 pyobjc 的 easy_install 可以正常工作,但我建议您不要这样做 - OSX 与 pyobjc 捆绑在一起(我不是肯定有 Lion;如果没有,您可以继续使用 easy_install)。通过导入 objc 或 AppKit 来测试默认 Python 是否已安装
  • 非常感谢!昨天浪费了几个小时,然后:) 我通常用 JavaScript (NodeJS) 编程,所以我忘记了 Python 是“包括电池”。
  • 自我注意:总是先阅读所有的 cmets。当 pyobjc-core 无法编译时,我(在不知不觉中)删除了“包含”安装,所以现在我被困在重新安装中,即使它一直都在那里。
【解决方案3】:

实际上,您可以使用 wxPython。参考我这里的相关回答:how to set a menubar icon on mac osx using wx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2010-10-27
    • 1970-01-01
    • 2015-10-06
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多