IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Le SpinBox et sa validation


Sujet :

Tkinter Python

  1. #1
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut Le SpinBox et sa validation
    Bonjour,

    Je suis occupé à faire un petit programme en python pour m'entraîner avec Tkinter, programme qui consiste en un convertisseur de chiffres Maya en chiffres arabes. (il sera mis en open-source dès que je le termine)

    J'utilise des spinbox pour ne permettre à l'utilisateur de ne choisir que des valeurs entières entre 0 et 19 (le système Maya est vicésimal).

    Voici un screenshot :

    http://img2.pict.com/25/d0/e3/250165...iffresmaya.png

    J'ai un soucis contenant les spinbox que j'utilise dans cette application. Voici comment je les crée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            # création des spinbox permettant de sélectionner les symboles Maya :
            self.spin=[]
            for j in range(1,9):
                spb = Spinbox(self.panneau_sup_a, from_=0, to=19, width=2, font=("Helvetica",20), justify=CENTER, command=lambda m=j-1:self.dcm(m))
                self.spin.append( spb )
            for y in range(0,8):
                self.spin[y].grid(row=2,column=y)
    Je stocke les références des spinbox dans une liste comme attribut de classe : self.spin

    La fonction self.dcm(num) prends un numéro (de 0 à 7) qui indique quel canvas doit être redessiné au dessus du spinbox correspondant (celui qui a lancé le callback).

    Mon problème est le suivant :

    Quand je sélectionne mes valeurs entre 0 et 19 avec les flèches du spinbox, aucun soucis : les valeurs renvoyées sont toujours bien entières et comprises dans cet intervalle.

    Quand je tape au clavier les valeurs dans le champ texte de la SpinBox : catastrophe !!!! même si j'ai réduit le champ width de la spinbox à 2 caractères, je me rends compte qu'on peut taper n'importe quoi dans la spinbox !

    Quelle horreur ! J'ai donc des messages d'erreurs si l'utilisateur tape erronément un de ses chiffres...

    Comment empêcher cela, et mettre en place une validation correcte, même quand la valeur du spin est tapée au clavier ?

    J'ai bien vu qu'il y avait les options validate= , validatecommand= pour le spinbox... mais comment les utiliser dans mon cas ?

    De plus, j'ai déjà une fonction lambda dans l'option command= , sera-t-il possible de mettre une fonction lambda supplémentaire dans la même ligne de déclaration d'un spinbox ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Une solution consiste à intercepter les événements clavier sur tes spinbox et vérifier si la valeur est correct. Voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    from Tkinter import *
     
    def validate():
        print spin.get()
     
    def onKeyRelease(e):
        value = spin.get()
        #verifie si l'utilisateur a saisi un entier
        try:
            int(value)
        except:
            var.set("0")
            return
        #si la valeur est > 19
        if int(value) > 19:
            var.set("19")
        #si la valeur est < 0
        elif int(value) < 0:
            var.set("0")
     
    root = Tk()
    var = StringVar()
    spin = Spinbox(root, from_=0, textvariable=var, to=19, width=2, command=validate)
    spin.bind("<KeyRelease>", onKeyRelease)
    spin.pack()
    root.mainloop()

  3. #3
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Merci pour ton intervention nyko77... Je teste ta solution et reviens plus tard pour te dire si ça marche...

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Un exemple par tyrtamos. C'est sur un Entry mais le principe est le même. Le traitement par char me semble intéressant dans ton cas.
    Le if (self.touche.char in "0123456789") or (self.touche.keysym == "BackSpace"): aussi.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    PauseKawa, merci pour ce lien intéressant qui complète mon info sur la validation des Spinbox... J'ai utilisé plutôt dans ce cas la solution mise en évidence par nyko77. (Bientôt le programme sera disponible en ligne gratuitement)

    Merci pour vos interventions qui sont toujours judicieuses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. test et validation de votre programme!!!
    Par l'indien dans le forum C
    Réponses: 8
    Dernier message: 25/06/2003, 15h43
  2. validation d'un XML schema
    Par nicolas_jf dans le forum Valider
    Réponses: 2
    Dernier message: 05/05/2003, 11h25
  3. est ce un XSchema Valide?
    Par Slash dans le forum Valider
    Réponses: 4
    Dernier message: 06/03/2003, 14h01
  4. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54
  5. [VB6] Evenement validate
    Par grosjej dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 05/09/2002, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo