按顺序打开ProgressDialog和Dialog时,对话框不是模态的

时间:2018-10-02 05:52:36

标签: python wxpython

我正在Windows7机器上使用Python 3.6.5运行wxPython 4.0.1 msw(凤凰),以及在Python 2.7上运行wxPython 2.9.4。

我正在观察一个模式对话框的问题,该对话框不会阻止对其后面父窗口的访问。仅当我运行进度对话框,然后运行模式对话框时,才会发生这种情况。此行为某种程度上与自定义对话框有关。像wx.MessageDialog这样的集成对话框似乎没有这个问题。

为找出问题,我写了一个例子。前两个按钮可以打开进度对话框或模式对话框,并且可以正常工作。第三个按钮按顺序打开两个对话框。在这种情况下,自定义对话框的模式功能不起作用,我可以访问和关闭大型机。这会导致多个问题。

Dialog is not modal, the main window can be accessed and closed

app.get("/ServiceWorker.js", (req, res) => {
  res.sendFile(path.resolve(__dirname, "public", "ServiceWorker.js"));
});

如果这是wxpython框架中的问题而不是我的实现中的问题,那么如果有人可以为我提供一种解决方法以按顺序显示此类对话框,那就太好了。

2 个答案:

答案 0 :(得分:0)

对我来说,这似乎是个错误。我不确定为什么会发生这种情况,但是一种解决方法是使用wx.CallLater

_show_modal_dialog更改为:

def _show_modal_dialog(self):
    def _make_dialog():
        with SomeDialog(self) as dlg:
            dlg.CenterOnParent()
            dlg.ShowModal()

    wx.CallLater(50, _make_dialog) # 50 mils is arbitrary

似乎可以解决对话框不起作用的问题。此解决方法的问题在于它将是非阻塞的,这意味着必须等待对话框返回的所有代码都必须移入对话框类或作为回调传递给对话框。

答案 1 :(得分:0)

同时,我自己发现了一个解决方法,我想与他人分享。

我添加了一个捕获Windows关闭事件的处理程序。

class TestFrame(wx.Frame):
    def __init__(self):
        #...
        self.Bind(wx.EVT_CLOSE, self.on_close)

此事件功能检查某些子对话框是否打开并处于模式状态,并执行否决权。

def on_close(self, event):
    # In case any modal dialog is open, prevent the frame from closing.
    for children in (c for c in self.Children if isinstance(c, wx.Dialog)):
        if children.IsModal():
            event.Veto()
            return
    event.Skip()

这也是一种解决方法,但是我似乎可以为我的用例工作。