2011-12-17 24 views
19

Después de haber pasado bastante tiempo buscando formas de acceder a una aplicación para la barra de menú, estamos cerca de admitir la derrota.¿Cómo hacer una aplicación de barra de menú (bandeja de sistema) para OSX en Python?

Básicamente, estamos buscando un ejemplo/puntero sobre cómo crear una aplicación que se colocará en la barra de menú (los iconos pequeños al lado del reloj) y tendrá un menú. Nada lujoso en absoluto.

Parece algo que debería ser muy fácil de hacer, pero no hemos podido encontrar un ejemplo que funcione.

¿Quizás no sea posible con Python? ¿Alguien sabe cómo otros lo hacen?

+0

Posiblemente una pregunta relacionada: http://stackoverflow.com/questions/3104818/cross-platform-python-gui-suitable-for-taskbar-win-and-menubar-mac- functiona –

+1

¿Qué tal [pyObjC] (http://pyobjc.sourceforge.net/)? – talonmies

+0

Gracias talonmies! Tengo problemas para instalarlo. Intentó easy_install, pero falló. Luego descargué el código fuente e intenté compilarlo (Python 2.7.1), pero aparece este error: error: no se pudo encontrar la distribución adecuada para Requirement.parse ('pyobjc-framework-ServiceManagement == 2.4a0'). Parece que esto podría requerir algo de trabajo. – freeall

Respuesta

24

Una opción sería usar rumps que proporciona un nivel de abstracción sobre PyObjC. Lo escribí específicamente para generar rápidamente estos tipos de aplicaciones sencillas de barra de estado.

Espero que esto pueda ayudar a algunas personas que buscan una solución semántica simple!

Sigue un breve fragmento de ejemplo. Los decoradores se usan para registrar funciones como devoluciones de llamada para eventos y temporizadores de clics. 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() 

pic

+0

Intenté ejecutar el código de muestra en el archivo Léame y todos los elementos del menú excepto "Salir" están deshabilitados. A menos que agregue setAction_ explícitamente, los elementos de menú están deshabilitados. Es este el comportamiento esperado? –

+0

Tuve que hacer 'port install py-pip && pip install pyobjc rumps' para que el ejemplo funcione. ¡Gracias! – e40

12

wxPython no podrá agregar un elemento de barra de tareas. Usted puede hacer esto en lugar de utilizar PyObjC así:

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

Sólo se refieren a la referencia de clase NSStatusItem hacer cosas para el artículo, por ejemplo, agregar un menú, cambiar la imagen resaltada, etc.

+1

Gracias, muy apreciado! Ahora si solo pudiera obtener PyObjC instalado ... – freeall

+1

hola freeall, si está usando python 2.6 y superior, creo que una instalación fácil de pyobjc funcionará bien, pero le sugiero que no haga esto - OSX viene incluido con pyobjc (No estoy seguro con Lion, si no lo tiene, puede continuar con easy_install). pruebe que Python por defecto si lo tiene instalado mediante la importación de objc o AppKit – maranas

+0

¡Muchas gracias! Eso fue unas horas perdidas ayer, luego :) Normalmente estoy programando en JavaScript (NodeJS) así que olvidé que Python es "baterías incluidas". – freeall

Cuestiones relacionadas