2009-09-02 9 views

Répondre

3

IntCtrl, Masked Edit Control, et NumCtrl, et sont tous conçus pour faire exactement cela, avec différents niveaux de contrôle. Vérifiez la démo wx sous "Plus de Windows/contrôles" pour voir comment ils fonctionnent.

(Ou, si vous êtes vraiment impatient de le faire directement avec un TextCtrl brut, je pense que vous voudriez attraper des événements EVT_CHAR, tester les caractères, et appeler evt.Skip() si c'était un caractère autorisé.)

4

Je devais faire quelque chose de similaire, en vérifiant les codes alphanumériques. La pointe sur EVT_CHAR était la bonne chose:

class TestPanel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, -1) 
     self.entry = wx.TextCtrl(self, -1) 
     self.entry.Bind(wx.EVT_CHAR, self.handle_keypress) 

    def handle_keypress(self, event): 
     keycode = event.GetKeyCode() 
     if keycode < 255: 
      # valid ASCII 
      if chr(keycode).isalnum(): 
       # Valid alphanumeric character 
       event.Skip() 
1

Vous pouvez IntCtrl, EVT_CHAR, ou mettre en œuvre un nouveau/validateur existant (comme IntValidator). Les validateurs peuvent être utilisés pour valider un champ (utile lors de la tentative de validation de plusieurs éléments dans un dialogue/panneau) et peuvent également être utilisés avec EVT_CHAR pour restreindre l'entrée dans un champ.

-1

Veuillez vérifier le script "Validator.py" dans la démo wxpython. c'est exactement ce dont vous avez besoin

0

Comme d'autres réponses le remarquent, il est possible de le faire avec un gestionnaire EVT_CHAR. Vous devrez appeler le event.Skip() pour les caractères que vous voulez laisser passer, et ne pas l'appeler pour ceux que vous voulez bloquer. Une nuance est que vous voulez probablement aussi appeler event.Skip() pour les caractères de tabulation; appuyer sur la tabulation déclenche l'événement EVT_CHAR, et si vous n'appelez pas event.Skip(), vous désactiverez effectivement la traversée de tabulation entre TextCtrl s.

est ici une application minimale montrant deux TextCtrl s qui acceptent des nombres entiers ou décimaux, avec l'onglet travail: traversal

import wx 

app = wx.App() 

frame = wx.Frame(None, -1, 'simple.py') 
panel = wx.Panel(frame) 
text_ctrl_1 = wx.TextCtrl(panel, value='123') 
text_ctrl_2 = wx.TextCtrl(panel, value='456', pos=(0, 30)) 

def block_non_numbers(event): 
    key_code = event.GetKeyCode() 

    # Allow ASCII numerics 
    if ord('0') <= key_code <= ord('9'): 
     event.Skip() 
     return 

    # Allow decimal points 
    if key_code == ord('.'): 
     event.Skip() 
     return 

    # Allow tabs, for tab navigation between TextCtrls 
    if key_code == ord('\t'): 
     event.Skip() 
     return 

    # Block everything else 
    return 

text_ctrl_1.Bind(wx.EVT_CHAR, block_non_numbers) 
text_ctrl_2.Bind(wx.EVT_CHAR, block_non_numbers) 

frame.Show() 
app.MainLoop() 
Questions connexes