RUMPS 更新应用程序标题
我最近在用 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 个回答
你可以通过设置类的 title
属性来更新应用程序的标题。
在类的任何方法中,你都可以这样写 self.title = "新标题"
。你也可以用 instance.title = "新标题"
这样来做,这样标题会立刻更新。
问题不在于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()
你的代码至少有两个问题:
在
sayhi
里调用super()
其实是没必要的。在
sayhi
里调用.title()
的时候,不应该传入一个 "self" 参数。
我不知道这两个问题是否和你的错误有关,因为我没有看到错误的详细信息。