2009-08-06 14 views
2

Je cherchais un moyen de transformer le texte entré dans le champ textctrl en majuscule. J'ai essayé d'utiliser un validateur et de transformer la valeur de l'objet d'événement key en majuscule en utilisant 'ord', mais je n'ai pas trouvé de méthode 'set'. Je peux être capable d'accéder à la variable de la classe d'événements directement car les variables de classe dans python ne sont jamais vraiment privées mais j'ai du mal à trouver l'information exacte dont j'ai besoin pour le faire.wxPython TextCtrl transformer en MAJUSCULES

De toute façon, cela semble être une approche trop compliquée. Quelqu'un d'autre a-t-il des suggestions? Est-ce que je manque quelque chose d'évident?

Répondre

3

Essayez ceci.

import wx 

class UpperTextCtrl(wx.TextCtrl): 
    def __init__(self, *args, **kwargs): 
     super(UpperTextCtrl, self).__init__(*args, **kwargs) 
     self.Bind(wx.EVT_TEXT, self.on_text) 
    def on_text(self, event): 
     event.Skip() 
     selection = self.GetSelection() 
     value = self.GetValue().upper() 
     self.ChangeValue(value) 
     self.SetSelection(*selection) 

class Frame(wx.Frame): 
    def __init__(self): 
     super(Frame, self).__init__(None, -1, 'Uppercase Text Control') 
     panel = wx.Panel(self, -1) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     text = UpperTextCtrl(panel, -1, style=wx.TE_MULTILINE) 

     # change the font 
     font = text.GetFont() 
     font.SetPointSize(12) 
     text.SetFont(font) 

     sizer.Add(text, 1, wx.EXPAND|wx.ALL, 10) 
     panel.SetSizer(sizer) 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop() 
+0

Très agréable. J'ai envisagé de modifier la sélection de texte, mais j'ai pensé que cela pourrait être un peu lent, ce n'est pas le cas. Pas perceptible pour quiconque tape de toute façon .. Merci c'est très très cool. En fait pour mes fins, sous-classer le contrôle me donne beaucoup plus d'idées pour le contrôler, merci encore. –

+0

Devrait utiliser ChangeValue au lieu de SetValue pour éviter un bug de récursivité. (SetValue génère à nouveau l'événement EVT_TEXT.) J'ai modifié le code. Je n'ai pas remarqué sur mon iMac mais j'ai remarqué sur Windows. – FogleBird

+0

Vous savez .. Je pense que je devrais être capable de comprendre celui-ci par moi-même .. mais je ne peux pas sembler trouver la bonne façon. Je veux être en mesure d'ajouter à cela la possibilité de changer sa police et de garder le même style, ça marche bien jusqu'à ce qu'il passe par la routine ontext(). J'ai essayé de définir la police après cela avec des résultats très très étranges. Des idées? Ive fait des recherches sur ce sujet depuis un certain temps –

1

Vérifiez cette solution.

import wx 
import string 

class UpperTextCtrl(wx.TextCtrl): 
    def __init__(self, *args, **kwargs): 
     super(UpperTextCtrl, self).__init__(*args, **kwargs) 
     self.Bind(wx.EVT_CHAR, self.on_char) 
    def on_char(self, event): 
     key=event.GetKeyCode() 
     text_ctrl=event.GetEventObject() 
     if chr(key) in string.letters: 
      text_ctrl.AppendText(chr(key).upper()) 
      return 
     event.Skip() 

class Frame(wx.Frame): 
    def __init__(self): 
     super(Frame, self).__init__(None, -1, 'Uppercase Text Control') 
     panel = wx.Panel(self, -1) 
     sizer = wx.BoxSizer(wx.VERTICAL) 
     text = UpperTextCtrl(panel, -1, style=wx.TE_MULTILINE) 

     # change the font 
     font = text.GetFont() 
     font.SetPointSize(12) 
     text.SetFont(font) 

     sizer.Add(text, 1, wx.EXPAND|wx.ALL, 10) 
     panel.SetSizer(sizer) 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = Frame() 
    frame.Show() 
    app.MainLoop()