2011-12-23 79 views
1

我有一個簡單的多行文本控件和確定/取消按鈕的形式。我想檢查點擊確定按鈕時文本控件是否有文本。我試圖使用wx.Validator來達到這個目的,但由於某種原因,它永遠不會被調用,即使額外的樣式wx.WS_EX_VALIDATE_RECURSIVELY被應用於父框架。這是我的代碼:wx.Validator不會被調用

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 64位,Python的2.7.2,wxPython的2.9.2.4

回答

2

相反的:

self.txt.Validate() 

使用:

self.Validate() 
+0

這太簡單明瞭了。不知道爲什麼我以前沒有嘗試過。謝謝你,它絕對做到了! – Vader 2011-12-24 08:38:58