【问题标题】:How to change the OSX menubar in wxPython without any opened window?如何在没有打开任何窗口的情况下更改 wxPython 中的 OSX 菜单栏?
【发布时间】:2011-02-25 10:33:46
【问题描述】:

我正在编写一个 wxPython 应用程序,该应用程序在关闭其所有窗口后仍保持打开状态 - 因此您仍然可以将新文件拖放到 OSX 停靠图标上(我使用 myApp.SetExitOnFrameDelete(False) 执行此操作)。

不幸的是,如果我关闭所有窗口,OSX 菜单栏将只包含一个“帮助”菜单。我想至少添加一个文件/打开菜单项,或者只保留主窗口的菜单栏。这在 wxPython 中是否可能?

事实上,我也会对非 wxPython hack 感到满意(例如,在 pyobjc 中设置菜单,但在 wxPython 中运行 GUI 的其余部分)。无论如何,在 OSX 中进行 wxPython 开发就是一种 hack ;)

更新:我使用 Lyndsey Ferguson 的提示设法解决了这个问题。这是我所做的:

  • 在启动时,我创建了一个窗口,我立即显示和隐藏。我将它的位置设置为(-10000,-10000),这样它就不会在屏幕上闪烁(啊,多么肮脏的黑客!)
  • 我在该窗口中创建了一个空的 EVT_CLOSE 事件处理程序,以使其无法关闭。
  • 似乎销毁一个窗口会重置OSX菜单,但隐藏不会...所以当最后一个窗口关闭时,我需要再次显示和隐藏这个窗口(隐藏是必要的,这样用户就无法切换到这个窗口使用窗口菜单或 Cmd-`)

是的,这真的很难看...如果有人提出更漂亮的解决方案,我将非常感激。

更新 2: 实际上它可以通过更简单的方式解决:如果我们不关闭最后一个窗口,只需隐藏它.并确保它不再响应菜单事件。

【问题讨论】:

  • 是的,这是一个令人不快的 hack - 但它可以工作,让您专注于添加您需要的功能 :)
  • 有趣的一个。我使用了一次隐藏窗口黑客,但将坐标设置为正数,超出了屏幕的分辨率(因为 Windows 或 Linux 都不能很好地处理负数)。当一个多显示器用户抱怨他的第二台显示器上有一个虚拟窗口时,我咬了我:)

标签: python macos wxpython pyobjc


【解决方案1】:

现在您可以使用wx.MenuBar.MacSetCommonMenuBar() 设置在没有打开窗口时应该使用的菜单栏(您必须创建)。

如果您只想使用默认的 macOS 菜单栏(应用程序和窗口菜单已经存在),这似乎是最少的代码:

menubar = wx.MenuBar()
wx.MenuBar.MacSetCommonMenuBar(menubar)

这将使您的应用也可以开箱即用地响应 Command+Q

wx.MenuItem ID wx.ID_ABOUTwx.ID_EXITmenu items with those IDs are moved to the macOS Application menu 是特殊的。文档实际上将应用程序菜单称为“Apple”菜单(例如,the wx.MenuBar.OSXGetAppleMenu() function's docs 中描述的菜单是应用程序菜单),可能是出于历史原因。

【讨论】:

    【解决方案2】:

    你能在屏幕外某处创建一个隐藏窗口吗?这是一个 hack,但我记得我必须做很多 hack 才能使我的基于 wxPython 的应用程序在 Mac OS X 上正常工作。

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

    旁白:您是否考虑过将 Python 应用程序的 GUI 部分分解并在 Mac OS X 上使用 PyObjC?你会得到更多的原生行为......

    【讨论】:

    • 这是正确的:wxWidgets 的工作方式(或过去工作)是菜单栏需要一个框架来附加到(想想 Windows)。现在,更高版本的 wxWidgets 框架(例如 2.9)可能已经修复了这个问题,因此您可以将菜单栏与应用程序相关联......但我不知道这是否在 wxPython 领域中可用
    • 感谢您的提示!这个隐藏的窗口是一个好主意,虽然它需要更多的黑客攻击(见上文)......是的,我计划一段时间放弃 wxPython(它以不同的方式在所有平台上都很糟糕),但现在我不有时间写两次 GUI。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 2011-11-10
    • 2021-08-22
    • 1970-01-01
    • 2014-08-31
    • 2012-05-05
    相关资源
    最近更新 更多