2009-09-02 21 views

risposta

3

IntCtrl, Masked Edit Control e NumCtrl sono tutti progettati per fare proprio questo, con diversi livelli di controllo. Controlla la demo wx in "Altri Windows/Controlli" per vedere come funzionano.

(Oppure, se invece non vedi l'ora di farlo direttamente con un TextCtrl non elaborato, penso che ti piacerebbe prendere gli eventi EVT_CHAR, testare i caratteri e chiamare evt.Skip() se fosse un carattere consentito)

4

Ho dovuto fare qualcosa di simile, controllando i codici alfanumerici. La punta sulla EVT_CHAR era la cosa giusta:

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

Si può provare IntCtrl, EVT_CHAR, o implementare un nuovo/validatore esistente (come IntValidator). I validatori possono essere utilizzati per convalidare un campo (utile quando si tenta di convalidare più cose su una finestra di dialogo/pannello) e possono anche essere usati con EVT_CHAR per limitare l'input in un campo.

-1

Controllare lo script "Validator.py" nella demo wxpython. è esattamente ciò di cui hai bisogno

0

Come altre risposte, è possibile farlo con un gestore EVT_CHAR. Dovrai chiamare lo event.Skip() per i personaggi che vuoi trasmettere e non chiamarlo per quelli che vuoi bloccare. Una sfumatura è che probabilmente si desidera chiamare anche event.Skip() per i caratteri di tabulazione; premendo la scheda si attiva l'evento EVT_CHAR e, se non si chiama event.Skip(), si disabilita efficacemente l'attraversamento delle schede tra TextCtrl s.

Ecco un'applicazione minima che mostra due TextCtrl s che accettano intero o numeri decimali, con scheda di lavoro trasversale:

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