RUMPS обновление заголовка приложения

#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:

В вашем коде есть как минимум две проблемы:

  1. Вызов super() в sayhi не требуется

  2. При вызове .title() in sayhi вы не должны передавать аргумент «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" . Он немедленно обновляется.