Je veux avoir un contrôle de texte qui n'accepte que des nombres. (Juste des valeurs entières comme 45 ou 366)Est-il possible de limiter TextCtrl pour n'accepter des nombres que dans wxPython?
Quelle est la meilleure façon de faire cela?
Je veux avoir un contrôle de texte qui n'accepte que des nombres. (Juste des valeurs entières comme 45 ou 366)Est-il possible de limiter TextCtrl pour n'accepter des nombres que dans wxPython?
Quelle est la meilleure façon de faire cela?
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é.)
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()
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.
Veuillez vérifier le script "Validator.py" dans la démo wxpython. c'est exactement ce dont vous avez besoin
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()