Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从statusItem菜单项启动的NSWindow不会显示为活动窗口_Python_Cocoa_Pyobjc - Fatal编程技术网

Python 从statusItem菜单项启动的NSWindow不会显示为活动窗口

Python 从statusItem菜单项启动的NSWindow不会显示为活动窗口,python,cocoa,pyobjc,Python,Cocoa,Pyobjc,我有一个用PyObjC编写的statusItem应用程序。statusItem有一个菜单项,该菜单项应在单击时启动一个新窗口: # Create statusItem statusItem = NSStatusBar.systemStatusBar().statusItemWithLength_(NSVariableStatusItemLength) statusItem.setHighlightMode_(TRUE) statusItem.setEnabled_(TRUE) statusIte

我有一个用PyObjC编写的statusItem应用程序。statusItem有一个菜单项,该菜单项应在单击时启动一个新窗口:

# 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)
首选项是一个NSWindowController类:

class Preferences(NSWindowController):
当我在XCode(Build&Go)中运行应用程序时,它工作得很好。但是,当我从XCode外部运行build.app文件时,statusItem和menuItem会按预期显示,但当我单击Preferences menuItem时,窗口不会显示。我已经通过检查控制台输出来验证launchPreferences代码是否正在运行

此外,如果我再次双击.app文件,则会显示该窗口,但如果我通过单击(例如)Finder窗口来更改活动窗口,则“首选项”窗口将消失。在我看来,这似乎与活动窗口有关

更新1 我试过答案,但都没用。如果我添加到launchPreferences方法:

preferences.makeKeyAndOrderFront_()

然后我得到一个错误:

“首选项”对象没有属性


您需要向应用程序发送activateIgnoringOtherApps:消息,然后发送窗口MakeKeyandDerfront:

在目标C中,这将是:

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

您需要向应用程序发送activateIgnoringOtherApps:消息,然后发送窗口MakeKeyandDerfront:

在目标C中,这将是:

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

我不知道PyObjC,从未使用过它,但是如果这是Objective-C代码,我认为如果希望它成为第一个前端窗口,应该在window对象上调用:on。新创建的窗口既不需要是键,也不需要是前窗口,除非您在本例中使其既不是键,也不是键


另一个让我担心的问题是,你说当窗口不再处于活动状态时,它会消失(变得不可见)。这听起来好像你的窗口不是真正的窗口。您是否在Interface Builder中将其意外设置为“实用程序窗口”?在窗口第一次显示在屏幕上之前,您是否可以尝试手动设置窗口级别,使用setLevel:将其设置为NSNormalWindowLevel?当窗口处于非活动状态时,它是否仍会消失?

我不知道PyObjC,从未使用过,但如果这是Objective-C代码,如果希望它成为第一个前窗口,那么应该调用:on the window对象。新创建的窗口既不需要是键,也不需要是前窗口,除非您在本例中使其既不是键,也不是键


另一个让我担心的问题是,你说当窗口不再处于活动状态时,它会消失(变得不可见)。这听起来好像你的窗口不是真正的窗口。您是否在Interface Builder中将其意外设置为“实用程序窗口”?在窗口第一次显示在屏幕上之前,您是否可以尝试手动使用setLevel:将窗口级别设置为NSNormalWindowLevel,以确定它在变为非活动状态时是否仍然消失?

MakeKeyandDerfront无效,并且setLevel会导致“Preferences”对象没有属性“setLevel”错误。实际上,MakeKeyandDerfront也有同样的错误:“Preferences”对象没有属性“MakeKeyandDerfront”MakeKeyandDerfront没有效果,setLevel导致“Preferences”对象没有属性“setLevel”错误。实际上,MakeKeyandDerfront也有同样的错误:“Preferences”对象没有属性“MakeKeyandDerfront”