Python - 如何在Mac OS X上使用GUI应用程序制作守护程序?

Dal*_*len 5 python macos user-interface icons wxpython

在Windows上很容易.只需用pythonw运行你的程序而不是python,代码将在后台执行.

所以,我希望实现的目标很容易安排.

我有一个应用程序,它真的是一个做地下工作的服务.但是这项服务需要一个控制面板.

所以,在Windows上我使用wxPython来创建一个GUI,甚至一些wx东西来提供所需的服务,当用户完成调整后,她/他点击隐藏和显示(False)在主窗口上调用.

因此,GUI消失,服务在后台继续工作.用户可以随时使用热键将其恢复.

麻烦的是,在Mac OS X上,这种策略只在某种程度上起作用.

当调用wx.Frame.Show(False)时,窗口随其菜单栏一起消失,服务工作正常,但应用程序仍在那里可见.

无论您无法对其进行任何操作,都可以切换到它.它仍然存在于Dock等等.

当程序使用python或pythonw或与Py2App捆绑时会发生这种情况.

无论我做什么,图标都会停留在那里.

必须有一些技巧,允许程序员删除这个顽皮的图标,从而当他/他不想被打扰时,停止打扰可怜的小用户.

隐藏窗口显然是不够的.谁知道诀窍?

注意:我真的很想按照上面描述的方式进行,而不是混淆两个独立的进程和IPC.

编辑:

经过多次挖掘,我发现了这些:

如何从Mac OS X dock隐藏应用程序图标

http://codesorcery.net/2008/02/06/feature-requests-versus-the-right-way-to-do-it

如何隐藏Dock图标

根据最后一个链接,正确的方法是使用:

[NSApp setActivationPolicy: NSApplicationActivationPolicyAccessory];
Run Code Online (Sandbox Code Playgroud)

要么

[NSApp setActivationPolicy: NSApplicationActivationPolicyProhibited];
Run Code Online (Sandbox Code Playgroud)

所以我想要的(运行时从后台切换到前台和后台)是可能的.

但是如何从Python中做到这一点???

常量:NSApplicationActivationPolicyProhibited和NSApplicationActivationPolicyAccessory存在于AppKit中,但我无法在任何地方找到setApplicationActivationPolicy函数.

NSApp()没有它.

我知道有一种方法可以通过使用ctypes加载objc dylib,委托给NSApp并发送"setApplicationActivationPolicy:<constant_value>",但我不知道wx.App()会造成多大的麻烦.对于应该已经可用的东西来说,它有点多功.

根据我的经验,同时活跃的NSApp()和wx.App()非常不喜欢彼此.

也许我们可以得到wx以某种方式使用的NSApp()实例并使用wx的委托???

请记住,已经建议的解决方案是启动代理并切换到前台或运行多个进程并且在我的情况下执行IPC是非常不受欢迎的.

所以,理想情况下,使用setApplicationActivationPolicy是我的目标,但如何?(简单易行,wx.App()请不要搞砸.)

有任何想法吗???

Jon*_*ing 0

好的。这是执行您想做的事情的代码:

import AppKit
info = AppKit.NSBundle.mainBundle().infoDictionary()
info["LSUIElement"] = "1"
Run Code Online (Sandbox Code Playgroud)

这是您不想做的更混乱的答案,但无论如何我都会列出它。在info.plist文件中添加此键:

<key>LSUIElement</key>
<string>1</string>
Run Code Online (Sandbox Code Playgroud)

另一个更守护进程的解决方案,但意味着它不能有 GUI,您可以将此密钥添加到文件中info.plist

<key>LSBackgroundOnly</key>
<string>1</string>
Run Code Online (Sandbox Code Playgroud)

来源