0

PyObjC で書かれた statusItem アプリケーションがあります。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)

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 menuItem をクリックするとウィンドウが表示されません。コンソール出力を確認して、launchPreferences コードが実行されていることを確認しました。

さらに、もう一度 .app ファイルをダブルクリックすると、ウィンドウが表示されますが、たとえば Finder ウィンドウをクリックしてアクティブなウィンドウを変更すると、設定ウィンドウが消えます。これは、アクティブなウィンドウと関係があるように思えます。

更新 1これら 2 つの回答 を試しましたが、どちらも機能しません。launchPreferences メソッドに追加すると、次のようになります。

preferences.makeKeyAndOrderFront_()

また

preferences.setLevel_(NSNormalWindowLevel)

次に、エラーが発生します。

「設定」オブジェクトには属性がありません

4

2 に答える 2

5

アプリケーションに activateIgnoringOtherApps: メッセージを送信してから、ウィンドウの makeKeyAndOrderFront: を送信する必要があります。

Objective-C では、これは次のようになります。

[NSApp activateIgnoringOtherApps:YES];
[[self window] makeKeyAndOrderFront:self];
于 2008-09-30T09:39:54.810 に答える
1

私は PyObjC について何も知りません。それを使用したことはありませんが、これが Objective-C コードである場合、最初のフロント ウィンドウにしたい場合は、ウィンドウ オブジェクトでmakeKeyAndOrderFrontを呼び出す必要があると思います。新しく作成されたウィンドウは、キーでもフロントでもない必要があります。

私が心配しているもう1つの問題は、ウィンドウがアクティブでなくなるとウィンドウが消える(見えなくなる)と言うことです。これは、あなたのウィンドウが実際のウィンドウではないように思えます。Interface Builder で誤って「ユーティリティ ウィンドウ」に設定していませんか? 非アクティブになったときにウィンドウが消えるかどうかにかかわらず、ウィンドウが初めて画面に表示される前に setLevel: to NSNormalWindowLevel を使用してウィンドウ レベルを手動で設定してみてください。

于 2008-09-30T09:45:10.227 に答える