Jak zrobić aplikację paska menu (paska systemowego) dla OSX w Pythonie?

Po spędzeniu trochę czasu patrząc na sposoby aplikacji dla paska menu jesteśmy blisko do przyznania się do porażki.

W zasadzie szukamy tylko przykładu / wskaźnika na temat tego, jak utworzyć aplikację, która umieści się na pasku menu (małe ikony obok zegara) i ma menu. Nic wymyślnego.

Wydaje się, że to coś, co powinno być bardzo łatwe do zrobienia, ale nie byliśmy w stanie znaleźć przykładu, który zadziała.

Może z Pythonem nie jest to możliwe? Czy ktoś wie, jak inni to robią?

Author: talonmies, 2011-12-17

3 answers

Opcją byłoby użycie rumps który zapewnia poziom abstrakcji na szczycie PyObjC. Napisałem go specjalnie do szybkiego generowania tego typu prostych aplikacji na pasku stanu.

Mam nadzieję, że pomoże to kilku osobom szukającym prostego, semantycznego rozwiązania!

Poniżej krótki przykładowy fragment. Dekoratory są używane do rejestracji funkcji jako wywołania zwrotne dla zdarzeń kliknięć i timerów. Istnieje również wsparcie dla 10.8 powiadomienia.

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()

pic

 24
Author: Jared,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-01 03:11:20

WxPython nie będzie mógł dodać elementu paska zadań. Możesz to zrobić używając PyObjC w ten sposób:

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

Wystarczy odwołać się do klasy nsstatusitem, aby zrobić coś z elementem, np. dodać menu, zmienić obrazek podświetlenia itp.

 12
Author: maranas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-17 16:39:29

Właściwie to Ty can Użyj wxPython. Zobacz moją pokrewną odpowiedź tutaj: Jak ustawić ikonę paska menu na mac osx za pomocą wx

 0
Author: Generic Ratzlaugh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 12:54:35