grafica - ¿Cómo hacer una aplicación de barra de menú(bandeja de sistema) para OSX en Python?
menu tkinter (3)
En realidad, puedes usar wxPython. Consulte mi respuesta relacionada aquí: cómo configurar un icono de barra de menú en mac osx usando wx
Después de haber pasado bastante tiempo buscando maneras de acceder a una aplicación para la barra de menú, estamos cerca de admitir la derrota.
Básicamente, solo estamos buscando un ejemplo / puntero sobre cómo crear una aplicación que se coloque en la barra de menú (los iconos pequeños al lado del reloj) y tenga un menú. Nada lujoso en absoluto.
Se siente como algo que debería ser muy fácil de hacer, pero no hemos podido encontrar un ejemplo que funcione.
Tal vez no es posible con Python? ¿Alguien sabe como otros lo hacen?
wxPython no podrá agregar un elemento de la barra de tareas. Puedes hacer esto usando PyObjC de la siguiente manera:
from AppKit import NSStatusBar
status_item = NSStatusBar.systemStatusBar().statusItemWithLength_(-1) #NSVariableStatusItemLength
status_item.setImage_(<NSImage instance to status icon>)
Solo consulte la referencia de clase NSStatusItem para hacer cosas al elemento, por ejemplo, agregue un menú, cambie la imagen resaltada, etc.
Una opción sería utilizar rumps
que proporcionen un nivel de abstracción sobre PyObjC. Lo escribí específicamente para generar rápidamente este tipo de aplicaciones simples de la barra de estado.
¡Espero que esto pueda ayudar a algunas personas que están buscando una solución semántica simple!
Un breve fragmento de ejemplo sigue. Los decoradores se utilizan para registrar funciones como devoluciones de llamada para eventos de clic y temporizadores. También hay soporte para 10.8 notificaciones.
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()