wxPython官方文档中文翻译 - 窗口删除概述

90 阅读4分钟

官方文档:docs.wxpython.org/window_dele…

窗口删除可能是一个容易让人感到困惑的问题,因此提供这一概述,以帮助明确在何时以及如何删除窗口,或者如何响应用户关闭窗口的请求。

窗口删除过程中的事件顺序

当用户在框架或对话框中点击系统关闭按钮或系统关闭命令时,wxPython会调用wx.Window.Close。这继而会生成一个wx.EVT_CLOSE事件:请参阅wx.CloseEvent

应用程序有责任定义一个合适的事件处理程序,并决定是否销毁该窗口。如果应用程序由于某种原因正在强制关闭(wx.CloseEvent.CanVeto返回False),则该窗口应当始终被销毁,否则可以选择忽略该关闭请求,或者也许可以先等待用户回答一个问题,然后再决定关闭窗口是否安全。如果wx.EVT_CLOSE的处理程序不销毁窗口,就应该通过调用wx.CloseEvent.Veto向调用代码发出信号。调用这个方法会向调用代码提供有用的信息。

wx.CloseEvent处理程序应该仅调用wx.Window.Destroy来删除窗口,而不要使用del运算符。这是因为对于某些窗口类,wxPython会将窗口的实际删除操作延迟到所有事件都处理完毕之后,否则存在将事件发送到已不存在窗口的风险。

正如在下一部分中会进一步强调的那样,调用Close并不能保证窗口会被销毁。如果你想确保窗口被销毁,那就调用wx.Window.Destroy

关闭窗口

你的应用程序既可以像框架那样使用wx.Window.Close事件,也可以直接调用wx.Window.Destroy方法。如果使用Close() 方法,你可以向该函数传递一个True参数,以告知事件处理程序我们确实想要删除该框架,且此操作不能被否决。

使用Close而不是Destroy的优点在于,它会调用由wx.EVT_CLOSE处理程序定义的任何清理代码;例如,它可能会先询问用户是否应保存工作内容,然后再关闭窗口中包含的文档。在此过程中,Close操作可能会被否决(返回False),而Destroy则肯定会销毁该窗口。

默认窗口关闭行为

wx.Dialog的默认关闭事件处理程序会模拟一个取消命令,生成一个wx.ID_CANCEL事件。由于这个取消事件的处理程序本身可能会调用Close方法,所以会进行防止无限循环的检查。wx.ID_CANCEL的默认处理程序会隐藏对话框(如果是无模式对话框),或者调用EndModal(wx.ID_CANCEL) (如果是模式对话框)。换句话说,默认情况下,对话框不会被销毁。

wx.Frame的默认关闭事件处理程序会使用Destroy() 方法来销毁该框架。

用户从菜单中调用退出操作

当用户从菜单中调用退出选项时,我该怎么做呢?你可以简单地在框架上调用wx.Window.Close方法。这将调用你自己的关闭事件处理程序,该处理程序可能会销毁该框架。

你可以进行检查,以确定此时你的应用程序是否能够安全退出,既可以在关闭事件处理程序中进行检查,也可以在退出菜单命令处理程序中进行检查。例如,你可能希望检查所有文件是否都已保存。给用户一个机会,可以选择保存并退出、不保存但仍要退出,或者完全取消退出命令。

优雅地退出应用程序

当最后一个顶级窗口(wx.Framewx.Dialog)被销毁时,wxPython应用程序会自动退出。将任何应用程序范围的清理代码放置在wx.AppConsole.OnExit 方法中(这是一个方法,而不是一个事件处理程序)。

子窗口的自动删除

子窗口会在父窗口的析构函数中被删除。这包括任何本身就是框架或对话框的子窗口,所以你可能需要在父窗口的关闭处理程序中显式关闭这些子框架或子对话框窗口。

其他类型的窗口

到目前为止,我们一直在讨论“托管”窗口,也就是frame和对话框。有父窗口的窗口,比如控件,不会有延迟销毁的情况,而且通常也没有关闭事件处理程序,不过如果你愿意的话,也可以实现这些处理程序。为了保持一致性,当显式删除这类窗口时,继续使用wx.Window.Destroy方法,而不要使用del运算符。