wxPython官方文档中文翻译 - Validator概述

69 阅读3分钟

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

Validator基本概念

validator概念的目的是让对话框的编写变得更加容易。validator是一个可以插入到控件(比如wx.TextCtrl)中的对象,它在Python数据与控件之间起中介作用,在两个方向上传输数据并对数据进行验证。它还能够拦截由控件生成的事件,从而提供过滤行为,而无需派生一个新的控件类。

wx.Validator还可用于拦截输入字段内的按键操作以及其他事件。要使用验证器,你必须创建自己的wx.Validator子类(在wxPython中既没有实现TextValidator,也没有实现GenericValidator)。然后通过调用以下方式将这个子类与你的输入字段关联起来:

myInputField.SetValidator(myValidator)

注意:你的wx.Validator子类必须实现wx.Validator.Clone方法。

请注意,任何wx.Window都可以有一个validator;使用WS_EX_VALIDATE_RECURSIVELY样式(请参阅窗口扩展样式),你还可以实现递归校验。

Validator剖析

创建新validator类的程序员应该提供以下功能。

validator的构造函数负责让程序员能够指定所需的校验类型,并且可能还会接收一个指向Python变量的指针,该变量用于存储控件的数据。如果用户没有提供这样的变量地址,那么validator应该在内部存储数据。

如果控件中的数据(而非Python变量中的数据)有效,wx.Validator.Validate方法应返回true。如果数据无效,该方法还应显示一条恰当的消息。

wx.Validator.TransferToWindow成员函数应该将数据从validator或相关联的Python变量传输到控件中。

wx.Validator.TransferFromWindow成员函数应该将数据从控件传输到validator或相关联的Python变量中。

应该有一个拷贝构造函数,以及一个wx.Validator.Clone函数,该函数返回validator对象的一个副本。这一点很重要,因为validator是通过引用传递给窗口构造函数的,因此必须在内部进行克隆。

你可以选择为validator定义事件处理程序,以实现过滤功能。这些处理程序会在控件自身处理事件之前捕获事件(请参阅“事件是如何处理的”)。

Validator如何与对话框进行交互

为了使validator能够正确运行,必须在对话框初始化和关闭过程中的合适时机调用validator函数。

当调用wx.Dialog.Show(对于无模式对话框)或wx.Dialog.ShowModal(对于模式对话框)时,wx.Window.InitDialog函数会被自动调用。这接着会向对话框发送一个初始化事件。wxEVT_INIT_DIALOG事件的默认处理程序在wx.Window类中定义,其只是简单地调wx.Window.TransferDataToWindow函数。这个函数会找到窗口子控件中的所有validator,并为每个validator调用wx.Validator.TransferToWindow函数。因此,就在对话框显示之时,数据从Python变量传输到了对话框中。

注意

如果你使用的是窗口或面板而不是对话框,那么在显示窗口之前,你需要显式调用wx.Window.InitDialog函数。 例如,当用户点击某个按钮(比如OK按钮)时,应用程序首先应该调用wx.Window.Validate函数。如果任何子窗口验证器未能校验窗口数据,该函数将返回False。如果验证失败,按钮处理程序应立即返回。 其次,应用程序应该调用wx.Window.TransferDataFromWindow函数,如果调用失败则返回。然后,通过调用wx.Dialog.EndModal(如果是模态对话框)或wx.Dialog.Show(如果是无模式对话框)来结束对话框就是安全的了。 实际上,wx.Dialog包含一个针对ID_OK按钮的默认命令事件处理程序。其过程如下:

def OnOK(self, event):

if self.Validate() and self.TransferDataFromWindow():

if self.IsModal():

self.EndModal(wx.ID_OK)

else:

self.SetReturnCode(wx.ID_OK)

self.Show(False)

所以,如果使用validator以及一个普通的OK按钮,你甚至可能无需编写任何用于处理对话框关闭的代码。 如果你从资源文件加载对话框,你将需要遍历各个控件来设置验证器,因为无法在对话框资源中指定validator。