2012-04-08 66 views
0

我基於this response to another question on SO這應該做到以下幾點努力寫我的第一次驗證了wx.TextCtrl如何將wx.TextCtrl中的字母輸入轉換爲全部大寫字母?

所有的信件都打印成captial字母和文本字段應該只包含captial字母和數字。

然而,我的嘗試失敗有兩個方面:

  • 當我改變我的模板沒有(從linked response拍攝)添加到文本字段。

  • 我不能將小寫字母改爲大寫字母。

這裏是我的嘗試:

import wx 
import string 

######################################################################## 
class CharValidator(wx.PyValidator): 
    ''' Validates data as it is entered into the text controls. ''' 

    #---------------------------------------------------------------------- 
    def __init__(self, flag): 
     wx.PyValidator.__init__(self) 
     self.flag = flag 
     self.Bind(wx.EVT_CHAR, self.OnChar) 

    #---------------------------------------------------------------------- 
    def Clone(self): 
     '''Required Validator method''' 
     return CharValidator(self.flag) 

    #---------------------------------------------------------------------- 
    def Validate(self, win): 
     return True 

    #---------------------------------------------------------------------- 
    def TransferToWindow(self): 
     return True 

    #---------------------------------------------------------------------- 
    def TransferFromWindow(self): 
     return True 

    #---------------------------------------------------------------------- 
    def OnChar(self, event): 
     keycode = int(event.GetKeyCode()) 
     if keycode < 256: 
      if keycode > 96 & keycode < 123: 
       keycode = keycode - 32 
      #print keycode 
      key = chr(keycode) 
      #print key 
      return 
     event.Skip() 

######################################################################## 
class ValidationDemo(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Text Validation Tutorial") 

     panel = wx.Panel(self) 
     textOne = wx.TextCtrl(panel, validator=CharValidator('no-alpha')) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(textOne, 0, wx.ALL, 5) 
     panel.SetSizer(sizer) 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = ValidationDemo() 
    frame.Show() 
    app.MainLoop() 

回答

0

其實所有的驗證功能都是不必要的。您只需要一個事件處理程序(請注意,它是草率編寫的,並且被硬編碼到特定的textOne對象,而不是接受輸入對象)。

此外,它似乎是一個很好的IDWA移動InsertionPoint

import wx 

class ValidationDemo(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Text Validation Tutorial") 

     panel = wx.Panel(self) 
     self.textOne = wx.TextCtrl(panel) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.textOne, 0, wx.ALL, 5) 
     panel.SetSizer(sizer) 

     self.Bind(wx.EVT_TEXT, self.OnTextType, self.textOne) 

    def OnTextType(self, event): 
     self.textOne.ChangeValue(unicode.upper(self.textOne.GetValue())) 
     self.textOne.SetInsertionPointEnd() 


# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = ValidationDemo() 
    frame.Show() 
    app.MainLoop() 
+0

你應該選擇回答你發佈的問題和要求的答案,而不是你自己的回答。在任何情況下,你的回答都不會解決你自己發佈的需求:首先,它不驗證任何只能轉換爲大寫的任何可以轉換的內容,其次,它不符合你突出顯示的行「文本域只應包含大寫字母和數字」。所以我建議你自動降低自己:-)。 – joaquin 2012-04-12 12:24:25

+0

也許我的問題是錯誤的。我其實不需要驗證器。我只是想要所有的信件都在captials。而且你是對的,丟棄非數字或字符沒有實現。但是,這是我想達到的。至少它回答了文字問題(即標題)。我不想粗魯,真的很感謝你的回答。但這是我找到的答案,我發佈了它並接受它作爲參考(並沒有爲它賺取任何分數)。可以給你? – Henrik 2012-04-12 14:22:41

0

您的演示框架有一些問題與wxPython的widget樹結構。 這將允許你在文本控件寫:

class ValidationDemo(wx.Frame): 
    """""" 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Text Validation Tutorial") 

     textOne = wx.TextCtrl(self, validator=CharValidator('no-alpha')) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(textOne, 1, wx.ALL| wx.EXPAND, 5) 
     self.SetSizer(sizer) 
     self.Fit() 

在驗證方面,你是不是送你的信一次計算textcontrol。最糟糕的是,你總是回來並殺死這個事件。

這工作(我在評論解釋):

def OnChar(self, event): 
    keycode = int(event.GetKeyCode()) 
    # 
    # get the widget where the text entry takes place 
    object = self.GetWindow() 
    # 
    # for upper-case and for numbers, let the event go 
    if (58 > keycode > 47) or (91 > keycode > 64): 
     event.Skip() 
    # 
    # for lower-case, convert to upper and write it yourself 
    elif 123 > keycode > 96: 
     keycode = keycode - 32 
     key = chr(keycode) 
     object.write(key) 

注意我打電話self.GetWindow()每個字符的事件。在你的情況下,只有一個控制器使用驗證器,你可以在驗證器初始化時只定義一次self.object

+0

感謝您的答覆。我最終認爲,我不是驗證函數,而是一個事件處理程序,因爲您似乎也暗示了這一點。看到我自己的答案,實現這一點。 – Henrik 2012-04-12 10:14:30

相關問題