Je veux avoir un contrôle de texte qui n'accepte que des chiffres. (Juste des valeurs entières comme 45 ou 366) p>
Quelle est la meilleure façon de faire cela? P>
7 Réponses :
(ou, si vous êtes plutôt impatient de le faire directement avec une textuelle brute, je pense que vous voudriez attraper des événements EvT_Car, tester les personnages et appelez EvT.skip () s'il était autorisé caractère.) p> INTCTRL code>,
Masked Modifier contrôle code> et
NumCtrl code> sont tous conçus pour faire exactement cela, avec différents niveaux de contrôle. Checkout la démo WX sous "Plus Windows / Controls" pour voir comment ils fonctionnent. P>
Je devais faire quelque chose de similaire, vérifiant les codes alphanumériques. La pointe sur EvT_Char était la bonne chose:
Comment fonctionnera-t-il pour des cas lorsque l'utilisateur appuie sur le bouton Del ou les boutons fléchés?
Vous pouvez essayer intctrl code>,
evt_char code> ou implémenter un validateur nouveau / existant (comme
Veuillez vérifier "validator.py" script dans la démo WXPYTHON. C'est exactement ce dont vous avez besoin p>
Comme autre réponse note, il est possible de le faire avec un Voici une application minimale montrant deux EVT_CHAR code> gestionnaire. Vous voudrez appeler
événement.skip () code> pour les caractères que vous souhaitez utiliser et ne pas l'appeler pour ceux que vous souhaitez bloquer. Une nuance est que vous souhaitez probablement aussi appeler
événement.skip () code> pour les caractères d'onglets; Appuyez sur onglet Déclenchers l'événement
evt_char code>, et si vous n'appelez pas
event.skip () code>, vous désactiverez efficacement l'onglet Traversal entre
TextCtrl code> s.
TextCtrl code> S qui acceptent des numéros entier ou décimal, avec une onglet de travail Traversal: P>
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()
Vous voudrez probablement également activer le retour arrière, le Del, la gauche-droite: si key_code in (8, 127, 314, 316): Event.skip () Retour code> Remarque, les valeurs peuvent être dépendantes de la plate-forme. .
@ jake77 Je crois que ces touches ne déclenchent pas evt_char code> du tout (et donc les recherchez dans un
evt_char code> gestionnaire est inutile), bien que je sache plus tard.
NumCtrl a des bizarreries étranges pour moi. Voici ma tentative de créer un contrôle numérique basé sur EvT_Char et Cockode.
Ce contrôle permet des numéros ainsi que tous les codes clés spéciaux (Combo CTRL, la touche fléchée, le backacace, etc.), de sorte que la copie-coller, annuler-rédo, sélectionner-tous, etc. fonctionne toujours. Il ne bloquera que d'autres caractères imprimables (en utilisant String.Princtable ) et des caractères unicode (en utilisant WXK_NONE < / a>) p> Une autre façon de vérifier et de permettre à tous les codes clés spéciaux peut être trouvé par Cette réponse . C'est une meilleure approche mais nécessite plus de code. P>
Je voulais la même chose que pour les flotteurs, j'ai donc utilisé la méthode suivante dans la classe: pour enregistrer l'événement dans le constructeur: p> Modification de la réponse ci-dessus p> p>