Desidero avere un controllo testo che accetta solo numeri. (Solo valori interi come 45 o 366)È possibile limitare TextCtrl per accettare numeri solo in wxPython?
Qual è il modo migliore per farlo?
Desidero avere un controllo testo che accetta solo numeri. (Solo valori interi come 45 o 366)È possibile limitare TextCtrl per accettare numeri solo in wxPython?
Qual è il modo migliore per farlo?
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)
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()
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.
Controllare lo script "Validator.py" nella demo wxpython. è esattamente ciò di cui hai bisogno
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()