【问题标题】:Getting the frontmost window in a WX application获取 WX 应用程序中最前面的窗口
【发布时间】:2014-02-11 17:31:28
【问题描述】:

我正在使用 wxPython 编写一个可以在 OS X、Windows 和 Linux 下运行的应用程序。我正在尝试实现标准的“关闭窗口”菜单项,但我不确定如何找出最前面的窗口。 WX 有一个GetActiveWindow function,但显然这只适用于 Windows 和 GTK。在 OS X 上是否有内置方法可以做到这一点? (如果没有,为什么不呢?)

【问题讨论】:

  • 不是有菜单的窗口是唯一可以接收您正在处理的关闭窗口菜单事件的窗口吗? IE 为了激活“关闭窗口”,用户已经不得不把这个窗口放在前面,所以......这是你必须关闭的那个?
  • @GreenAsJade 我不认为这是正确的。当我作为主窗口的子窗口(带有菜单栏的窗口)打开一个窗口时,菜单栏仍然在屏幕上可见,并且可以通过键盘快捷键访问。
  • 但是无论如何,如果他们在一个窗口上操作菜单的“关闭窗口”选项,那么他们就是选择关闭那个窗口。操作一个名为“关闭窗口”的菜单项来关闭一些 other 窗口会让我觉得很奇怪。这听起来不像“标准关闭窗口”行为。
  • @GreenAsJade 我说的是 OS X,每个应用程序只有一个菜单栏。 (您可以为不同的窗口显示不同的菜单栏,但在我的情况下,我选择不这样做。)因此有一个“关闭窗口”菜单项,选择它应该关闭最前面的窗口.
  • 知道了 - 让我考虑一下 :) 需要考虑,因为最重要的窗口取决于窗口管理器(在本例中为 OSX)。我什至不确定为什么我自己没有遇到这个问题:)

标签: wxpython wxwidgets


【解决方案1】:

如果有一个关闭/退出应用程序菜单项并使用: http://wxpython.org/Phoenix/docs/html/PyApp.html?highlight=gettopwindow#PyApp.GetTopWindow

调用它的 Close 方法。

维尔纳

【讨论】:

  • 我在 OS X 上试过这个,但这个方法返回的“顶部窗口”似乎不是我想要的:它总是返回我应用程序的主窗口。 (也许是因为主窗口是应用程序中所有其他窗口的所有者?)
【解决方案2】:

添加关闭窗口,但仅适用于 mac。

        from sys import platform

        if platform == "darwin":
            self.file_menu.Append(wx.ID_CLOSE, _("&Close Window\tCtrl-W"), "")

绑定那个。

self.Bind(wx.EVT_MENU, self.on_click_close, id=wx.ID_CLOSE)

这就是我最终用于更大的 mac 相关例程的方法。它需要找到焦点窗口。那是在顶级父级中。但是,这个命令是在菜单栏加速表上触发的,所以我们只在 mac 中调用 close。我没有用 control+w 关闭主窗口

    def on_click_close(self, event=None):
        try:
            window = app.GetTopWindow().FindFocus().GetTopLevelParent()
            if window is self:
                return
            window.Close(False)
        except RuntimeError:
            pass

基本上,任何有焦点的东西和那个东西的顶级父级是前景中的窗口。所以继续关闭它,除非那个窗口是主窗口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2011-07-14
    相关资源
    最近更新 更多