RUMPS 更新应用程序标题

1 投票
3 回答
1471 浏览
提问于 2025-04-18 10:15

我最近在用 rumps 开发一个小的 Python 应用程序,想要定期更新状态栏中的应用程序标题。rumps 里似乎有个函数可以实现我想要的功能,但我就是搞不定。下面是我改编的一些示例代码,展示了我遇到的问题:

import rumps

class AwesomeStatusBarApp(rumps.App):
    def __init__(self):
        super(AwesomeStatusBarApp, self).__init__("Awesome App")
        self.menu = ["updating"]

    @rumps.timer(1)
    def sayhi(self, _):
        super(AwesomeStatusBarApp, self).title(self,"Hi")

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

在初始化函数里的 super 调用工作得很好,而在 sayhi 函数里的 title 函数应该正好能更新标题并告诉 NSStatusBar 更新它,但我却遇到了以下错误:

2014-06-18 10:03:26.033 Python[29628:1107] : 'NoneType' object is not callable

然后出现了一大堆错误追踪信息(我可以提供,不过格式不太好)。

我觉得我遇到的错误可能和线程有关,但我不知道该怎么处理。我试着不使用 rumps,但自己用 NSStatusBar 也搞不定,总是报错。我想做的事情其实很简单,但总是无法正常工作,真让人失望。

任何帮助或建议都很感激,谢谢!

3 个回答

0

你可以通过设置类的 title 属性来更新应用程序的标题。

在类的任何方法中,你都可以这样写 self.title = "新标题"。你也可以用 instance.title = "新标题" 这样来做,这样标题会立刻更新。

0

问题不在于rumps或PyObjC,而是几个简单的Python错误。你可能需要了解一下Python中的类是怎么工作的。

Ronald提到的两点关于这一行是正确的,

super(AwesomeStatusBarApp, self).title(self, "Hi")

其实没有必要调用父类的实现,

self.title(self, "Hi")

但这仍然是错误的,因为在类的方法之间不需要手动传递self,这个是自动完成的,

self.title("Hi")

这也是错的,因为title是一个属性,所以应该改成,

self.title = "Hi"

完整代码:

import rumps

class AwesomeStatusBarApp(rumps.App):
    def __init__(self):
        super(AwesomeStatusBarApp, self).__init__("Awesome App")
        self.menu = ["updating"]

    @rumps.timer(1)
    def sayhi(self, _):
        self.title = "Hi"

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

你的代码至少有两个问题:

  1. sayhi 里调用 super() 其实是没必要的。

  2. sayhi 里调用 .title() 的时候,不应该传入一个 "self" 参数。

我不知道这两个问题是否和你的错误有关,因为我没有看到错误的详细信息。

撰写回答