使用 Applescript 创建一个简单的菜单栏应用程序
Posted
技术标签:
【中文标题】使用 Applescript 创建一个简单的菜单栏应用程序【英文标题】:Creating a simple menubar app using Applescript 【发布时间】:2015-03-20 14:08:07 【问题描述】:我正在尝试在 OS X Yosemite 中创建一个菜单栏应用程序,它只包含一个带有子菜单的下拉菜单。此菜单及其子菜单将由 applescript 脚本填充。
我之前找到过类似的教程,但它们似乎都已经过时并且在 Xcode 6.2 中不能正常工作,例如这个:
MenuApp_ASOC
我在 Applescript 方面经验丰富,但没有太多时间编写 Objective C 代码。
在哪里可以找到我想要创建的各种模板?
【问题讨论】:
看看我的回答***.com/a/29194549/261305 @markhunte 谢谢!这几乎正是我正在寻找的。在您的示例中,下拉列表中的项目数似乎是静态的。 我将使用从解析的 shell 脚本输出中收集的项目填充下拉列表。我怎么能这样做?我当前的非菜单栏应用程序按如下方式填充其列表(精简示例):repeat with theItem in myInstances's items 1 through -1 ... copy title:text item 2 of theNewItem to end of library ... end repeat loadDataSource_(library)
是否也可以在您的代码中使用此方法?
对上一条评论中的错误格式表示歉意。
我已经发布了一个答案,我认为这就是您要问的问题,否则请告诉我
我已经更新了答案以更好地说明菜单项是动态的
【参考方案1】:
这是一个快速创建菜单系统的简单示例。这就是我认为你所追求的。
在此示例中,每次单击状态栏菜单时,菜单项都会有所不同。
(需要优胜美地)
将此代码粘贴到新的脚本编辑器 Applescript 文档中。
使用“另存为...”菜单选项将其保存为保持打开的应用程序。
然后将应用程序作为普通应用程序运行。
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property StatusItem : missing value
property selectedMenu : "" -- each menu action will set this to a number, this will determin which IP is shown
property theDisplay : ""
property defaults : class "NSUserDefaults"
property internalMenuItem : class "NSMenuItem"
property externalMenuItem : class "NSMenuItem"
property newMenu : class "NSMenu"
property theList : "Jackson Aiden Liam Lucas Noah Mason Ethan Caden Jacob Logan Jayden Elijah Jack Luke Michael Benjamin Alexander "
-- example list for the menu items that can be used. Ideally you will have your list created dynamically
-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
display alert "This script must be run from the main thread." buttons "Cancel" as critical
error number -128
end if
on menuNeedsUpdate:(menu)
(* NSMenu's delegates method, when the menu is clicked this is called.
We use it here to call the method makeMenus(). Which removes the old menuItems and builds new ones.
This means the menu items can be changed dynamically.
*)
my makeMenus()
end menuNeedsUpdate:
on makeMenus()
newMenu's removeAllItems() -- remove existing menu items
-----< (* this is just to show in this example a dynamic list for the menu items
set someListInstances to
set counter to count of word of theList
repeat until (count of someListInstances) is (random number from 3 to counter)
set rnd to random number from 1 to counter
set thisItem to word rnd of theList
if thisItem is not in someListInstances then
copy thisItem to end of someListInstances
end if
end repeat
---- <
repeat with i from 1 to number of items in someListInstances
set this_item to item i of someListInstances
set thisMenuItem to (current application's NSMenuItem's alloc()'s initWithTitle:this_item action:"someAction:" keyEquivalent:"")
(newMenu's addItem:thisMenuItem)
(thisMenuItem's setTarget:me) -- required for enabling the menu item
if i is equal to 3 then
(newMenu's addItem:(current application's NSMenuItem's separatorItem)) -- add a seperator
end if
end repeat
end makeMenus
--menuItems action is requied for the menu to be enabled
on someAction:sender
--MenuItem --do some thing
end someAction:
-- create an NSStatusBar
on makeStatusBar()
set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
-- set up the initial NSStatusBars title
StatusItem's setTitle:"IP"
-- set up the initial NSMenu of the statusbar
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
newMenu's setDelegate:me (*
Requied delegation for when the Status bar Menu is clicked the menu will use the delegates method (menuNeedsUpdate:(menu)) to run dynamically update.
*)
StatusItem's setMenu:newMenu
end makeStatusBar
my makeStatusBar()
【讨论】:
这太棒了,谢谢!您是否也有关于添加子菜单的教程? @markhunte @yannikrock 不要手。但是您可以阅读文档developer.apple.com/library/mac/documentation/Cocoa/Reference/… 和developer.apple.com/library/mac/documentation/Cocoa/Reference/… 关于如何在菜单中显示图片有什么建议吗?像点击菜单,你会看到一张图片...https://developer.apple.com/documentation/appkit/nsmenuitem/1514819-image 似乎令人回味,但可能有其他用途...【参考方案2】:我鼓励您访问http://macscripters.net 的 ASOC 论坛,那里的人可能会回答您的问题,关于如何使其与 XCode 6.2 一起使用。但是你必须努力记录你遇到的问题/错误,当然,仅仅“不工作”不足以解决你的问题。
不管怎样,这就是你必须要做的事情,除非你很高兴找到一个适用于 XCode 项目的菜单应用程序。
在 macscripters 内部,http://macscripter.net/viewtopic.php?id=38891&p=1 有一个由 DJ Bazzie Wazzie 制作的小得多的菜单应用程序项目,它可能更容易制作。您可以在该主题或 ASOC 论坛中解决任何问题。
Shane Stanley,两本好 ASOC 书籍的作者和 ASOC 编辑经常访问那里的论坛,是一个非常乐于助人和善良的人!
【讨论】:
以上是关于使用 Applescript 创建一个简单的菜单栏应用程序的主要内容,如果未能解决你的问题,请参考以下文章
AppleScript:菜单栏项目单击(但没有 AXDescription)