¿Hay alguna manera de mostrar la salida de AppleScript en la barra de menú?


8

Antes de seguir leyendo: Sé sobre mayordomo y programas similares. Estoy buscando una forma integrada de hacer esto sin una aplicación de terceros.

De todos modos, escribí un AppleScript que ejecuta un comando de shell. Quiero mostrar esa salida en la barra de menú en la parte superior ... sin Butler, ¿cómo puedo hacer esto?


Dado que AppleScriptObjC es parte de macOS (2014), es posible utilizar su marco "Foundation" (incluidos los métodos de NSMenu) para lograr lo que probablemente no fue posible en 2012.. . . . . ¡Vea mi respuesta a continuación sobre cómo hacerlo!
clemsam lang

Respuestas:


2

Como generalidad, sin un programa de terceros, como Growl, no hay una forma integrada de hacerlo.

Sin embargo, podría escribir un script u otro programa como el que encontré aquí que le proporciona el servicio de menú. Estoy seguro de que la integración de Growl sería mucho más fácil de lograr.


1

No hay una forma integrada de hacer esto en OS X. Sin embargo, usando Growl , puede recibir notificaciones. Aquí hay un script de muestra para eso:

--Make sure Growl is running
tell application "System Events"
    set isRunning to (count of (every process whose bundle identifier is "com.Growl.GrowlHelperApp")) > 0
end tell

if isRunning then
    tell application id "com.Growl.GrowlHelperApp"
        set the allNotificationsList to ¬
            {"Test Notification", "Another Test Notification"}
        --Notifications can be enabled in System Preferences>Growl>Applications>Display Options
        set the enabledNotificationsList to ¬
            {"Test Notification"}
        register as application ¬
            "Growl AppleScript Sample" all notifications allNotificationsList ¬
            default notifications enabledNotificationsList ¬
                    -- Set the icon. You can use any icon from any application
            icon of application "AppleScript Editor"

        notify with name ¬
            "Test Notification" title ¬
            "Test Notification" description ¬
            "This is a test AppleScript notification." application name "Growl AppleScript Sample"

        notify with name ¬
            "Another Test Notification" title ¬
            "Another Test Notification :) " description ¬
            "Alas — you won't see me until you enable me..." application name "Growl AppleScript Sample"

    end tell
end if

Eso debería mostrar esto:

Y si también tiene habilitada la otra notificación:

Aquí se describen técnicas más avanzadas .


1

Dado que AppleScriptObjC es parte de macOS, es posible utilizar su marco "Foundation" (incluidos los métodos de NSMenu) para lograr lo que probablemente no fue posible en 2012.

Encontré un script interesante para crear menús personalizados desde AppleScript; de esto extraje el código adecuado para colocar texto en la barra de menú de macOS . De hecho, utiliza solo el "título" de un menú para insertar contenido.

Para demostrar esto, implementé un script de diálogo muy básico que solicita a los usuarios la entrada de texto (esperando 6 segundos) que luego se muestra en la barra de menú temporalmente (5 segundos).
Aquí está:

use framework "Foundation"
use framework "AppKit"
use scripting additions
property StatusItem : missing value
property newMenu : class "NSMenu"

display dialog "Write something:" default answer "" giving up after 6
set myText to text returned of the result
if myText is "" then set myText to "TOOOOO slow … try again !"
set myText to ">>    " & myText & "    <<"

set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
StatusItem's setTitle:myText
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
StatusItem's setMenu:newMenu

delay 5
current application's NSStatusBar's systemStatusBar()'s ¬
        removeStatusItem:StatusItem  

Este código AppleScript se puede usar en cualquier script suyo. (Su parte de "diálogo" es opcional ...)

user3439894 me ayudó a cerrar mi "menú", ver la última línea del script. ¡Muchas gracias!


¿Por casualidad tiene un enlace al código fuente original del que obtuvo su respuesta? Sería bueno verlo. Gracias.
user3439894

1
Sí - está en el último controlador de la respuesta aceptada a esta pregunta: /programming/29168474/creating-a-simple-menubar-app-using-applescript. . . . . Sin embargo, me temo que mi última línea (funciona la mitad del tiempo) que encontré en otro lugar –y adaptada– NO es correcta . . . . . . No soy programador, así que necesito más tiempo para entender el código.
clemsam lang

1
Por cierto, es una buena respuesta y si no fuera por "se estrelló varias veces, debido a" dealloc () "?" Tendría +1. Sin embargo, algo de reflexión ... si usa este código como una aplicación AppleScriptObjC independiente, tal vez eso sería mejor, entonces StatusItem's dealloc()solo es aplicable a la aplicación AppleScriptObjC y no al Editor de scripts y la bloquea accidentalmente.
user3439894

FWIW La primera set myText to ...línea de código , el display dialog comando anterior, realmente no hace nada en función del código resultante y, por lo tanto, no es necesario en absoluto. En otras palabras, la única usada valor de myTextes la que se asigna después de que el display dialog comando se ejecuta y por qué ajustarlo a cualquier cosa antes de la del display dialog comando no se utiliza la codificación y no es necesario en el contexto del código presentado actualmente.
user3439894

1
En lugar de StatusItem's dealloc()o StatusItem's setTitle:""usaría:current application's NSStatusBar's systemStatusBar()'s removeStatusItem:StatusItem
user3439894
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.