单击wx.Dialog中的"确定"或"取消"按钮时,为什么没有触发EVT_CLOSE?

bde*_*ham 8 wxwidgets wxpython

我有一个wx.Dialog子类,当用户单击OK按钮时需要执行几个清理操作.该的wx.Dialog文件称,点击确定或取消应该发射EVT_CLOSE事件:

EVT_CLOSE:用户或以编程方式关闭对话框(请参阅Window.Close).用户可以生成此事件,单击关闭按钮(通常是标题栏右上角的"X")(如果存在)(请参阅CLOSE_BOX样式)或单击带有ID_CANCEL或ID_OK ID的按钮.

但是,我正在使用WX 2.9.5.0(通过wxPython),当我在此测试应用程序中单击"确定"或"取消"时,不会调用OnClose方法.单击系统的关闭按钮(我正在使用OS X)时调用OnClose.我是否实现了此事件处理错误或者wx.Dialog是否真的不符合其文档?在后一种情况下,拦截单击"确定"按钮的最佳方法是什么?

from __future__ import print_function
import wx

class TestDialog(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, title='Test Dialog')

        sizer = wx.BoxSizer(wx.VERTICAL)

        message = wx.StaticText(self, wx.NewId(), 'This is some dummy text')
        sizer.Add(message)

        ok_button = wx.Button(self, wx.ID_OK, 'OK')
        cancel_button = wx.Button(self, wx.ID_CANCEL, 'Cancel')

        btn_sizer = self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)
        btn_sizer.Add(cancel_button)
        btn_sizer.Add(ok_button)
        sizer.Add(btn_sizer)

        self.SetSizer(sizer)

        self.Bind(wx.EVT_CLOSE, self.OnClose)

    def OnClose(self, event):
        print('In OnClose')
        event.Skip()

if __name__ == '__main__':
    app = wx.App(False)

    dialog = TestDialog(None)
    result = dialog.ShowModal()
    print('Result: {}'.format(result))
Run Code Online (Sandbox Code Playgroud)

Rob*_*unn 4

当您单击模式对话框上的“确定”或“取消”按钮时,该对话框不会以 关闭Close,而是以 结束,EndModal因此EVT_CLOSE不会发送事件。模式对话框正常完成时需要运行的代码通常放在调用ShowModal. 我认为在这种情况下,文档是不正确的。

OTOH,如果对话框显示为无模式(用而Show不是ShowModal),那么它们应该用 关闭Close,您将收到EVT_CLOSE事件。