gpt4 book ai didi

cocoa - NSMenuItem 中的动画进度条

转载 作者:行者123 更新时间:2023-12-03 17:07:34 24 4
gpt4 key购买 nike

我想在 NSMenuItem 自定义 View 中放置一个动画进度条。这在 Apple 的 MenuItemView 示例中得到了演示,但它没有动画(至少在 10.5 中没有,并且该示例显然来自 10.4)。

我尝试设置一个调用 setNeedsDisplay:YES 的计时器,如文档所述,安排为 NSEventTrackingRunLoopMode 。这有效,但仅适用于确定的进度条(如果我更改值),并且仅在菜单第一次打开时。第二次和连续几次,条形图重画两次,然后保持卡住状态。对于不确定的进度条,理发杆条纹永远不会动画。

<小时/>编辑:代码片段。我刚刚添加了 itemChanged 调用,这似乎没有任何效果。更新纯文本项目效果很好。

class AppDelegate(NSObject):
barItem = None
menuProgressBar = None
progressItem = None

def applicationDidFinishLaunching_(self, sender):
statusbar = NSStatusBar.systemStatusBar()
self.statusitem = statusbar.statusItemWithLength_(
NSSquareStatusItemLength)
self.statusitem.setHighlightMode_(True)
image = NSImage.imageNamed_("menubar.png")
self.statusitem.setImage_(image)
self.statusitem.retain()

menu = NSMenu.alloc().init()

AppDelegate.barItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('progress', None, '')
itemView = NSView.alloc().initWithFrame_(NSMakeRect(0, 0, 50, 20))
itemView.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar = \
NSProgressIndicator.alloc().initWithFrame_(NSMakeRect(16, 5, 22, 10))
AppDelegate.menuProgressBar.setAutoresizingMask_(NSViewWidthSizable)
AppDelegate.menuProgressBar.setControlSize_(NSSmallControlSize)
AppDelegate.menuProgressBar.setUsesThreadedAnimation_(True)
itemView.addSubview_(AppDelegate.menuProgressBar)
AppDelegate.menuProgressBar.setIndeterminate_(False)
AppDelegate.menuProgressBar.setMaxValue_(100)
AppDelegate.menuProgressBar.startAnimation_(self)
timer = NSTimer.timerWithTimeInterval_target_selector_userInfo_repeats_(
0.1, self,
objc.selector(self.animateProgress, signature='v@:'),
None, True)
NSRunLoop.currentRunLoop().addTimer_forMode_(
timer, NSEventTrackingRunLoopMode)
AppDelegate.barItem.setView_(itemView)
menu.addItem_(AppDelegate.barItem)

AppDelegate.progressItem = NSMenuItem.alloc(). \
initWithTitle_action_keyEquivalent_('Progress', None, '')
menu.addItem_(AppDelegate.progressItem)

self.statusitem.setMenu_(menu)

def animateProgress(self):
time = NSDate.timeIntervalSinceReferenceDate()
AppDelegate.menuProgressBar.setDoubleValue_(time%100)
AppDelegate.menuProgressBar.display()
AppDelegate.progressItem.setTitle_('Progress: %d'%(time%100))
AppDelegate.barItem.menu().itemChanged_(AppDelegate.barItem)

最佳答案

计时器方法应该是完全没有必要的。您是否告诉 NSProgressIndicator -setUsesThreadedAnimation:YES 然后告诉它 -startAnimation:?

关于cocoa - NSMenuItem 中的动画进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4089555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com