【问题标题】:NSMenuItem + Python + Dynamic VariablesNSMenuItem + Python + 动态变量
【发布时间】:2013-08-17 16:43:50
【问题描述】:

我正在尝试为此菜单项获取动态标签。我已经用 Python 编写了整个应用程序,但老实说 NSMenuItem 看起来有多少,我还不如用 Objc 重写它......

import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper

class MyApp(NSApplication):

    def finishLaunching(self):
        # Make statusbar item
        statusbar = NSStatusBar.systemStatusBar()
        self.statusitem = statusbar.statusItemWithLength_(NSVariableStatusItemLength)
        self.icon = NSImage.alloc().initByReferencingFile_('icon.png')
        self.icon.setScalesWhenResized_(True)
        self.icon.setSize_((20, 20))
        self.statusitem.setImage_(self.icon)

        #make the menu
        self.menubarMenu = NSMenu.alloc().init()

        self.menuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Click Me', 'clicked:', '')
        self.menubarMenu.addItem_(self.menuItem)

        self.quit = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Quit', 'terminate:', '')
        self.menubarMenu.addItem_(self.quit)

        #add menu to statusitem
        self.statusitem.setMenu_(self.menubarMenu)
        self.statusitem.setToolTip_('My App')

    def clicked_(self, notification):
        NSLog('clicked!')

if __name__ == "__main__":
    app = MyApp.sharedApplication()
    AppHelper.runEventLoop()

【问题讨论】:

  • 什么是错误?你没有指出它在哪里不起作用。当你做某事时,某事应该在某处发生,那不是吗?
  • 这并不是说它不起作用,但我不确定如何实现我想要一个项目的动态标签。创建状态栏后我可以修改的东西。
  • 您可以删除 MenuItem 并在菜单关闭时重新添加更改的值,或者在 NSMenuItem 和 NSMenuItem.alloc() 上寻找“重绘”类型的函数~应用程序就像一个画布,你可以改变你所看到的唯一方法是重绘部分或整个东西。我认为您不能只更改标签,但是如果您制作了自己的重绘功能,则可以传递标签,这将反映您当时希望他们阅读的内容。

标签: python objective-c variables dynamic nsmenuitem


【解决方案1】:

你试过setTitle_吗?

def clicked_(self, notification):
    self.menuItem.setTitle_("Clicked!")

或使用计时器:

def finishLaunching(self):
    # ...

    self.timer = NSTimer.alloc().initWithFireDate_interval_target_selector_userInfo_repeats_(NSDate.date(), 1.0, self, 'tick:', None, True)
    NSRunLoop.currentRunLoop().addTimer_forMode_(self.timer, NSDefaultRunLoopMode)
    self.timer.fire()


def tick_(self, arg):
    self.menuItem.setTitle_("Tick %d!" % int(time.time()))

对于实时更新,您可能需要JGMenuWindow (SO: How to update NSMenu while it's open?)

【讨论】:

  • 太棒了!正是我需要的。我将如何添加子菜单?我尝试使用 setSubmenu_ 添加菜单项,但它不起作用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多