如何在没有打开窗口的情况下,在wxPython中更改OSX菜单栏?

5
我正在编写一个wxPython应用程序,关闭所有窗口后仍保持打开状态 - 这样你仍然可以将新文件拖放到OSX dock图标上(我使用myApp.SetExitOnFrameDelete(False)实现此功能)。
不幸的是,如果我关闭所有窗口,OSX菜单栏只会包含“帮助”菜单。我想添加至少一个“文件/打开”菜单项,或者只保留主窗口的菜单栏。在wxPython中是否有可能做到这一点?
实际上,我也可以接受非wxPython的hack(例如,在pyobjc中设置菜单,但在wxPython中运行其余GUI)。在OSX中进行wxPython开发本身就是一种hack ;)
更新:我成功解决了这个问题,使用了Lyndsey Ferguson的提示。以下是我的做法:
- 在启动时,我创建一个窗口,立即显示和隐藏它。我将其位置设置为(-10000,-10000),以便它不会在屏幕上闪烁(哎呀,多么肮脏的hack!) - 我在该窗口中创建一个空的EVT_CLOSE事件处理程序,以便它无法关闭。 - 似乎销毁窗口会重置OSX菜单,但隐藏不会...因此,当最后一个窗口关闭时,我需要再次显示和隐藏此窗口(隐藏是必要的,以便用户无法使用“窗口”菜单或Cmd-`切换到此窗口)
是的,这真的很丑陋...如果有人想出一个更漂亮的解决方案,我会非常感激。
更新2:实际上可以用更简单的方法解决:如果我们不关闭最后一个窗口,只是将其隐藏。并确保它不再响应菜单事件。

是的,这是一种不太好的解决方案 - 但它能够工作,并让你专注于添加你需要的功能 :) - Lyndsey Ferguson
1
有趣的经历。我曾经使用过隐藏窗口技巧,但将坐标设置为正数,超出了屏幕的分辨率(因为Windows或Linux不能很好地处理负数)。当一个多显示器用户抱怨他的第二个显示器上有一个虚假窗口时,这个问题就困扰着我 :) - fraca7
2个回答

2
现在你可以使用wx.MenuBar.MacSetCommonMenuBar()来设置菜单栏(必须先创建)在没有窗口打开时应该使用的菜单栏。
如果你只想使用默认的macOS菜单栏(包含应用程序和窗口菜单),这似乎是最小化的代码:
menubar = wx.MenuBar()
wx.MenuBar.MacSetCommonMenuBar(menubar)

这将使您的应用程序默认支持响应 Command+Q,同时,wx.MenuItem 的 ID wx.ID_ABOUTwx.ID_EXIT 是特殊的,因为 具有这些 ID 的菜单项被移到了 macOS 应用程序菜单。文档实际上将应用程序菜单称为“苹果”菜单(例如,wx.MenuBar.OSXGetAppleMenu() 函数文档中描述的菜单 就是应用程序菜单),可能是出于历史原因。

1

你能创建一个在屏幕外的隐藏窗口吗?这是一种hack方法,但我记得为了让我的基于wxPython的应用程序在Mac OS X上正常工作,我不得不做很多hack。

注意:您将需要禁用关闭按钮并设置该隐藏窗口,以使其不显示在“窗口”菜单中。

另外:您是否考虑过将Python应用程序的GUI部分分解出来,在Mac OS X上使用PyObjC?这样您将获得更多本地行为...


这是正确的:wxWidgets的工作方式(或曾经的工作方式)是需要一个框架来附加菜单栏(类似于Windows)。现在,wxWidgets框架的较新版本(例如2.9)可能已经解决了这个问题,因此您可以将菜单栏与应用程序关联起来...但我不知道在wxPython领域是否可用。 - RyanWilcox
谢谢你的建议!这个隐藏窗口是个好主意,虽然还需要一些技巧(见上文)... 是的,我计划在某个时候放弃wxPython(它在所有平台上都有不同的问题),但现在我没有时间写两次GUI。 - gyim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接