WxPython - 不准确的模态窗口行为

时间:2017-08-24 08:08:49

标签: python-2.7 wxpython

我在WxPython中遇到了一些令人烦恼的模态帧行为。 众所周知,当一个模态窗口出现时,它出现在前景中(在主窗口的顶部),主窗口应该变得不可访问(例如没有响应点击)。

在使用Windows开始(状态)栏之前,这与嵌套的WxFrame一样正常工作。 如果用户点击Windows栏上的主框架,它会出现在第二帧的顶部,这是完全不准确的,因为用户不了解发生了什么以及窗口无法访问的原因。

我想到的第一个解决方案是绑定第一帧的激活事件,并以编程方式(并系统地)将第二帧设置为前景。然而,在我看来,WxPython自然没有完成这种行为。

有人对此有任何想法或任何原生/通用解决方案吗?

2 个答案:

答案 0 :(得分:0)

正如我在我的问题中所建议的那样,我绑定了激活事件,我提出了所有子窗口。这按预期工作。我们可以先进入顶层窗口,然后从第一个窗口开始加注,以便始终提升所有儿童框架。但是,对我来说总是很奇怪,它不是由wxPython自然管理的。

def __init__(self, parent):
   wx.Frame.__init__(...)
   ...
   self.Bind(wx.EVT_ACTIVATE, self.on_activate_window)

def on_activate_window(self, event):
    """
    Set modal windows to foreground by their hierarchical order
    """
    self.set_children_to_top(self.GetChildren())

def set_children_to_top(self, children):
    """
    Loops all children of the given windows, if any other modal window is found, it raises the new window to foreground
    """
    for child in children:
        if isinstance(child, wx.Frame) and child.is_modal:
            child.Raise()
        try:
            child_window = child.GetChildren()
            if child_window:
                self.set_children_to_top(child_window)
        except AttributeError:
            continue

答案 1 :(得分:0)

当你需要一个模态窗口时,使用wx.Dialog要好得多,因为它从一开始就设计成这样。事实上,由于不一致,MakeModal方法已经被删除了框架,但是如果你真的需要这样做,那么就有一种解决方法。