#python #pyobjc #nsstatusbar
#python #pyobjc #nsstatusbar
Вопрос:
Итак, я работал над небольшим приложением на python с использованием rumps, и я хотел бы периодически обновлять заголовок приложения в строке состояния. Похоже, в 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()
Суперзвонок в функции init работает просто отлично, а функция title в функции sayhi должна делать именно то, что я ищу, обновлять заголовок и сообщать NSStatusBar обновить его, однако я терплю неудачу со следующим результатом:
2014-06-18 10:03:26.033 Python [29628:1107]: объект ‘NoneType’ не вызывается
А затем большая обратная трассировка (которую я могу предоставить, она просто плохо отформатирована).
Я думаю, что ошибка, с которой я столкнулся, может иметь какое-то отношение к продолжающейся потоковой передаче, однако я не знаю, что делать. Я попытался отказаться от rumps, но я не могу заставить NSStatusBar работать самостоятельно, он всегда выдает свою собственную ошибку. Я хочу сделать что-то действительно простое, но, похоже, я никогда не смогу заставить его работать правильно, а жаль.
Любая помощь или совет приветствуются, спасибо!
Ответ №1:
В вашем коде есть как минимум две проблемы:
-
Вызов super() в
sayhi
не требуется -
При вызове
.title()
insayhi
вы не должны передавать аргумент «self»
Я понятия не имею, связано ли что-либо из этого с вашей проблемой, не видя обратной трассировки.
Ответ №2:
Проблема не в rumps или PyObjC — просто несколько простых ошибок Python. Возможно, вы захотите прочитать о том, как работают классы в Python.
Два пункта Рональда верны в этой строке,
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()
Ответ №3:
Вы можете обновить заголовок приложения, установив title
свойство класса.
Вы можете сделать self.title = "New Title"
это в любом методе класса. Вы также можете сделать instance.title = "New Title"
. Он немедленно обновляется.