2012-04-08 2 views
0

Ich versuche, meinen ersten Validator für wx.TextCtrl basierend auf this response to another question on SO zu schreiben, die folgenden tun sollen:Wie konvertiert man die alphabetische Eingabe in wx.TextCtrl in alle Großbuchstaben?

Alle Buchstaben als captial Buchstaben gedruckt werden sollen und das Textfeld nur captial Buchstaben und Zahlen enthält.

jedoch nicht meine Versuche in zweierlei Hinsicht:

  • Wenn ich meine Vorlage zu ändern (aus dem linked response) nichts wird das Textfeld hinzugefügt.

  • Ich kann kleine Buchstaben nicht in Großbuchstaben ändern.

Hier ist mein Versuch:

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() 

Antwort

0

Eigentlich ist das ganze Chaos mit der Validierungsfunktion unnötig. Sie brauchen nur einen eventhandler (beachten Sie, dass es schlampig geschrieben ist und fest auf das spezifische textOne Objekt codiert ist, statt das Eingabeobjekt zu übernehmen).

Darüber hinaus scheint es eine gute IDWa den InsertionPoint zu bewegen:

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

Sie sollten die Antwort auswählen, die Ihre gestellte Frage und Ihre Anforderungen beantwortet, nicht Ihre eigenen Nachworte. In jedem Fall adressiert Ihre Antwort nicht Ihre eigenen veröffentlichten Anforderungen: Erstens validiert sie nichts, konvertiert nur in Großbuchstaben, was konvertiert werden kann, und zweitens entspricht sie nicht Ihrer hervorgehobenen Zeile "das Textfeld sollte nur Großbuchstaben enthalten und Zahlen ". Also schlage ich vor, dass du dich selbst runterzählst :-). – joaquin

+0

Vielleicht wurde meine Frage missverstanden. Ich brauche keinen Validator. Ich möchte nur, dass alle Briefe in Großbuchstaben geschrieben sind. Und Sie haben Recht, das Verwerfen von Nicht-Ziffern oder Zeichen ist nicht implementiert. Das wollte ich erreichen. Zumindest beantwortet es die wörtliche Frage (d. H. Überschrift). Ich möchte nicht unhöflich sein und deine Antwort wirklich schätzen. Aber das ist die Antwort, die ich gefunden habe, und ich postete sie und akzeptierte sie als Referenz (und verdiente keine Punkte dafür). Ok für Sie? – Henrik

0

Ihr Demo-Rahmen hat ein Problem mit der wxPython-Widget Baumstruktur. Dies ermöglicht es Ihnen, in dem Text-Steuerelement zu schreiben:

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() 

Auf der Validator Seite, die Sie Ihre Briefe an die Textcontrol einmal berechnet nicht senden. Am schlimmsten ist es, dass du immer wieder zurückkehrst und das Ereignis tötest.

Dies funktioniert (ich in den Kommentaren erläutern):

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) 

Hinweis I self.GetWindow() für jedes Zeichen Ereignis nenne. In Ihrem Fall, wenn Sie nur eine Kontrolle mit dem Validator haben, können Sie self.object nur einmal bei der Validator-Initialisierung definieren.

+0

Vielen Dank für Ihre Antwort. Ich habe schließlich festgestellt, dass ich nicht die Validator-Funktion, sondern einen Event-Handler, wie Sie auch zu implizieren scheinen. Siehe meine eigene Antwort, die dies implementiert. – Henrik

Verwandte Themen