有没有办法在菜单栏中显示AppleScript输出?


8

在进一步阅读之前:我了解管家和类似程序。我正在寻找一种无需第三方应用程序的内置方法。

无论如何,我写了一个运行shell命令的AppleScript。我想在顶部的菜单栏中显示该输出...如果没有Butler,我该怎么做?


由于AppleScriptObjC是macOS(2014)的一部分,因此可以使用其“基础”框架(包括NSMenu的方法)来实现2012年可能无法实现的目标。。。。。请参阅下面有关如何做的答案!
clemsam lang 18/12/16

Answers:


2

通常,没有第三方程序(例如Growl),就没有内置的方法可以做到这一点。

但是,您可以编写一个脚本或其他程序(例如我在此处找到的脚本或其他程序)为您提供菜单服务。我相信Growl集成将更容易实现。


1

在OS X中没有内置的方法可以执行此操作。但是,使用Growl可以收到通知。这是一个示例脚本:

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

那应该显示如下:

并且如果您也启用了其他通知:

这里介绍更高级的技术


1

由于AppleScriptObjC是macOS的一部分,因此可以使用其“基础”框架(包括NSMenu的方法)来实现2012年可能无法实现的目标。

我找到了一个有趣的脚本,可以从AppleScript中创建自定义菜单。从中我提取了合适的代码以将文本放置在macOS的菜单栏中。实际上,它仅使用菜单的“标题”来插入某些内容。

为了演示这一点,我实现了一个非常基本的对话框脚本,该脚本要求用户输入文本(等待6秒),然后将其暂时显示在菜单栏中(5秒)。
这里是:

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  

此AppleScript代码可以在您的任何脚本中使用。(其“对话框”部分是可选的…)

user3439894 帮助关闭了我的“菜单”,请参阅脚本的最后一行。非常感谢!


您是否偶然有链接到您从中获得答案的原始源代码?很高兴看到。谢谢。
user3439894 '18

1
是的-它是该问题接受答案的最后一个处理程序:/programming/29168474/creating-a-simple-menubar-app-using-applescript。。。。。但是,我担心我在其他地方找到并修改的我的最后一行(一半时间有效)是不正确的。。。。。。我不是程序员,所以我需要更多时间来理解代码。
clemsam lang 18/12/14

1
顺便说一句,这是一个很好的答案,如果不是,那么“它崩溃了几次–因为“ dealloc()”?” 我将+1。虽然有些想法,但是...如果您将此代码用作独立的AppleScriptObjC应用程序,也许会更好,那么StatusItem's dealloc()它仅适用于AppleScriptObjC应用程序,而不适用于脚本编辑器,并会使其崩溃。
user3439894 '18

FWIW第一set myText to ...代码(即前一个display dialog 命令)实际上不会根据后续代码执行任何操作,因此完全不需要。换言之,唯一使用的myText是,在此之后被分配display dialog 命令运行,以及为什么其设置为任何东西的前display dialog 命令是未使用的编码和没有必要在的上下文代码当前呈现。
user3439894 '18

1
代替StatusItem's dealloc()StatusItem's setTitle:""我将使用:current application's NSStatusBar's systemStatusBar()'s removeStatusItem:StatusItem
user3439894 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.