9
votes

Est-il possible de limiter TextCtrl à accepter des numéros uniquement à WXPython?

Je veux avoir un contrôle de texte qui n'accepte que des chiffres. (Juste des valeurs entières comme 45 ou 366)

Quelle est la meilleure façon de faire cela?


0 commentaires

7 Réponses :


5
votes

INTCTRL , Masked Modifier contrôle et NumCtrl 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.

(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.)


0 commentaires

9
votes

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


1 commentaires

Comment fonctionnera-t-il pour des cas lorsque l'utilisateur appuie sur le bouton Del ou les boutons fléchés?



1
votes

Vous pouvez essayer intctrl , evt_char ou implémenter un validateur nouveau / existant (comme Intvalidator ). Les validateurs peuvent être utilisés pour valider un champ (utile pour tenter de valider plusieurs éléments sur une boîte de dialogue / un panneau) et ils peuvent également être utilisés avec EvT_char pour limiter l'entrée dans un champ.


0 commentaires

-1
votes

Veuillez vérifier "validator.py" script dans la démo WXPYTHON. C'est exactement ce dont vous avez besoin


0 commentaires

1
votes

Comme autre réponse note, il est possible de le faire avec un 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.

Voici une application minimale montrant deux 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()


2 commentaires

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 Remarque, les valeurs peuvent être dépendantes de la plate-forme. .


@ jake77 Je crois que ces touches ne déclenchent pas evt_char du tout (et donc les recherchez dans un evt_char gestionnaire est inutile), bien que je sache plus tard.



0
votes

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>)

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. xxx


0 commentaires

0
votes

Je voulais la même chose que pour les flotteurs, j'ai donc utilisé la méthode suivante dans la classe: xxx

pour enregistrer l'événement dans le constructeur: xxx

Modification de la réponse ci-dessus


0 commentaires