Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python wx.验证程序不';我没接到电话_Python_Wxpython_Validation - Fatal编程技术网

Python wx.验证程序不';我没接到电话

Python wx.验证程序不';我没接到电话,python,wxpython,validation,Python,Wxpython,Validation,我有一个简单的表单,上面有一个多行文本控件和Ok/Cancel按钮。我想检查单击“确定”按钮时文本控件是否有文本。为此,我尝试使用wx.Validator,但由于某些原因,它从未被调用,甚至额外的样式wx.WS_EX_VALIDATE_递归地应用于父帧。这是我的密码: import wx class Validator(wx.PyValidator): def __init__(self): wx.PyValidator.__init__(self) def

我有一个简单的表单,上面有一个多行文本控件和Ok/Cancel按钮。我想检查单击“确定”按钮时文本控件是否有文本。为此,我尝试使用wx.Validator,但由于某些原因,它从未被调用,甚至额外的样式wx.WS_EX_VALIDATE_递归地应用于父帧。这是我的密码:

import wx

class Validator(wx.PyValidator):
    def __init__(self):
        wx.PyValidator.__init__(self)

    def Clone(self):
        return Validator()

    def Validate(self, win):
        txt_ctrl = self.GetWindow()

        if len(txt_ctrl.GetValue()) == 0:
            wx.MessageBox('Please, provide a value.', 'Error')
            txt_ctrl.SetBackgroundColour('pink')
            txt_ctrl.SetFocus()
            txt_ctrl.Refresh()
            return False
        else:
            txt_ctrl.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
            txt_ctrl.Refresh()
            return True

    def TransferToWindow(self):
        return True

    def TransferFromWindow(self):
        return True

class OkCancelPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, wx.ID_ANY)

        self.btn_ok =  wx.Button(self, wx.ID_OK)
        self.btn_cancel = wx.Button(self, wx.ID_CANCEL)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.btn_ok, 0, wx.NORMAL|wx.ALL, 5)
        sizer.Add(self.btn_cancel, 0, wx.NORMAL|wx.ALL, 5)            
        self.SetSizer(sizer)
        sizer.Fit(self)
        self.Layout()

class Panel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, wx.ID_ANY)

        self.txt = wx.TextCtrl(self, wx.ID_ANY, style = wx.TE_MULTILINE)
        self.okcancel = OkCancelPanel(self)

        sizer_txt = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, 'Some text here'), wx.HORIZONTAL)
        sizer_txt.Add(self.txt, 1, wx.EXPAND, 0)
        sizer_txt.Layout()
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(sizer_txt, 1, wx.EXPAND|wx.ALL, 5)
        sizer.Add(self.okcancel, 0, wx.NORMAL|wx.ALIGN_RIGHT, 0)
        self.SetSizer(sizer)
        sizer.Fit(self)
        self.Layout()

class Frame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, wx.ID_ANY, 'Test Frame', size = (400, 300))
        self.SetSizeHints(minW = 400, minH = 300)

        self.panel = Panel(self)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.panel, 1, wx.EXPAND, 0)
        self.SetSizer(sizer)
        sizer.Fit(self)
        self.Layout()

        #--Shortcuts--#
        self.txt = self.panel.txt
        self.btn_ok = self.panel.okcancel.btn_ok
        self.btn_cancel = self.panel.okcancel.btn_cancel

class Controller(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.SetExtraStyle(wx.WS_EX_VALIDATE_RECURSIVELY)   

        self.txt.SetValidator(Validator())     

        self.Bind(wx.EVT_BUTTON, self.OnButton, self.btn_ok )

    def OnButton(self, evt):
        self.txt.Validate()

if __name__ == '__main__':
    app = wx.App()
    frame = Controller(None)
    frame.Show()
    app.SetTopWindow(frame)
    app.MainLoop()
那么,我做错了什么

当然我可以在
OnButton
方法中使用类似于
self.txt.GetValidator().Validate(self.txt)
的东西,但我不想要:)

Windows 7 x64、Python 2.7.2、wxPython 2.9.2.4而不是:

self.txt.Validate()
使用:


这是如此简单和明显。我不知道为什么我以前没试过。谢谢你,它确实成功了!
self.Validate()