2008-09-30 2 views
0

У меня есть приложение statusItem, написанное в PyObjC. StatusItem имеет MENUITEM, который предполагается запустить новое окно при щелчке:NSWindow запущен из statusItem menuItem не отображается как активное окно

# Create statusItem 
statusItem = NSStatusBar.systemStatusBar().statusItemWithLength_(NSVariableStatusItemLength) 
statusItem.setHighlightMode_(TRUE) 
statusItem.setEnabled_(TRUE) 
statusItem.retain() 

# Create menuItem 
menu = NSMenu.alloc().init() 
menuitem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Preferences', 'launchPreferences:', '') 
menu.addItem_(menuitem) 
statusItem.setMenu_(menu) 

The launchPreferences: метод:

def launchPreferences_(self, notification): 
    preferences = Preferences.alloc().initWithWindowNibName_('Preferences') 
    preferences.showWindow_(self) 

Preferences является классом NSWindowController:

class Preferences(NSWindowController): 

Когда я запускаю приложение в XCode (Build & Go), это отлично работает. Однако, когда я запускаю встроенный файл .app извне из XCode, statusItem и menuItem отображаются так, как ожидалось, но когда я нажимаю на пункт меню Preferences, окно не появляется. Я проверил, что код launchPreferences запускается путем проверки вывода консоли.

Кроме того, если я снова дважды щелкнуть файл .app, появится окно, но если я закрою активное окно, щелкнув, например, в окне Finder, окно настроек исчезнет. Мне кажется, что это связано с активным окном.

Update 1 Я попытался thesetwo ответов, но ни работа. Если добавить в метод launchPreferences:

preferences.makeKeyAndOrderFront_() 

или

preferences.setLevel_(NSNormalWindowLevel) 

тогда я просто получаю сообщение об ошибке:

'Preferences' object has no attribute

ответ

5

Вам необходимо отправить заявку activateIgnoringOtherApps: сообщение, а затем отправьте окно makeKeyAndOrderFront :.

В Objective-C это будет:

[NSApp activateIgnoringOtherApps:YES]; 
[[self window] makeKeyAndOrderFront:self]; 
1

Я не имею ни малейшего представления о PyObjC, никогда не используется, но если это был код Objective-C, я бы сказал, что вы должны назвать makeKeyAndOrderFront: на если вы хотите, чтобы он стал самым первым передним окном. Новое созданное окно не должно быть ни ключевым, ни передним, если вы не сделаете его ни одним из них, ни как, например, в обоих случаях.

Другая проблема, которая меня беспокоит, заключается в том, что вы говорите, что окно уходит (становится невидимым), когда оно больше неактивно. Это похоже на то, что в вашем окне нет реального окна. Вы случайно установили его как «служебное окно» в Interface Builder? Не могли бы вы попытаться вручную установить уровень окна, используя setLevel: до NSNormalWindowLevel, прежде чем окно будет отображаться на экране в первый раз, будет ли оно все еще исчезать, когда оно становится неактивным?

+0

makeKeyAndOrderFront не имеет эффекта, а результаты setLevel в объекте «Предпочтения» не имеют атрибута «setLevel_». – DavidM

+0

Собственно, makeKeyAndOrderFront также та же ошибка: Объект 'Preferences' не имеет атрибута 'makeKeyAndOrderFront_' – DavidM