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