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 :

Valider Entry avec touche Return


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Valider Entry avec touche Return
    Bonjour à tous,

    J'essaye d'apprendre la POO sous Python avec le livre de Swinnen, et là je bute sur un exo non corrigé.
    Cela consiste à modifier un programme pour qu'un champ entry soit validé par la touche Return et non par le bouton montrer.
    J'ai utilisé la méthode bind et j'ai ajouté la ligne suivante (ligne 15) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.entree.bind('<Return>',self.changeCouleurs)
    Mais lorsque je presse Return j'obtiens le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: changeCouleurs() takes 1 positional argument but 2 were given
    Je n'ai pas l'impression de passer deux arguments à la méthode changeCouleurs.
    Si quelqu'un pouvait m'expliquer, merci d'avance.


    Voici l'intégralité du programme :


    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    from random import randrange
     
    class Application(object):
          "Voici une classe de résistance"
     
     
          def __init__(self):
                self.root=Tk()
                self.root.title('Code des couleurs')
                self.dessineResistance()
                Label(self.root,text='Entrez la valeur de la résistance, en Ohms :').grid(row=2,column=1, columnspan=3)
                Button(self.root, text='Montrer', command=self.changeCouleurs).grid(row=3, column=1)
                Button(self.root,text='Quitter', command=self.root.destroy).grid(row=3, column=3)
                self.entree=Entry(self.root,width=14)
                self.entree.bind('<Return>',self.changeCouleurs)
                self.entree.grid(row=3, column=2)
     
                self.cc=['black', 'brown','red','orange', 'yellow', 'green', 'blue','purple', 'grey','white']
                self.root.mainloop()
     
          def dessineResistance(self):
                self.can=Canvas(self.root, width=500, height=200, bg='cornflower blue')
                self.can.grid(row=1,column=1, columnspan=3, padx=5, pady=5)
                self.can.create_line(20,100,480,100,width=6)
                self.can.create_rectangle(130,60,370,140,fill='beige', width=4)
                self.ligne=[]
                for x in range(170,300,48):
                      self.ligne.append(self.can.create_rectangle(x,62,x+36,138, fill='black', width=0))
     
          def changeCouleurs(self):
                """Affichage des couleurscorrespondant à la valeur entrée"""
                self.v1ch=self.entree.get()
                try:
                      v=float(self.v1ch)
                except:
                      err=1
                else:
                      err=0
                if err==1 or v<10 or v>1e11:
                      self.signaleErreur()
                else:
                      li=[0]*3
                      logv=int(log10(v))
                      ordgr=10**logv
                      li[0]=int(v/ordgr)
                      decim=v/ordgr-li[0]
                      li[1]=int(decim*10+0.5)
                      li[2]=logv-1
                      for n in range(3):
                            self.can.itemconfigure(self.ligne[n], fill=self.cc[li[n]])
     
          def signaleErreur(self):
                self.entree.configure(bg='red')
                for n in range(3):
                            self.can.itemconfigure(self.ligne[n], fill='black')
                self.root.after(1000,self.videEntree)
     
          def videEntree(self):
                self.entree.configure(bg='white')
                self.entree.delete(0,len(self.v1ch))
     
    if __name__=='__main__':
          from tkinter import*
          from math import log10
          f=Application()

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Que nous dit la doc officielle Tkinter ici : http://infohost.nmt.edu/tcc/help/pub...universal.html ?

    w.bind(sequence=None, func=None, add=None)
    This method is used to attach an event binding to a widget. See Section 54, “Events” for the overview of event bindings.

    The sequence argument describes what event we expect, and the func argument is a function to be called when that event happens to the widget. If there was already a binding for that event for this widget, normally the old callback is replaced with func, but you can preserve both callbacks by passing add='+'.
    Allons voir section 54 - Events : http://infohost.nmt.edu/tcc/help/pub...eb/events.html

    An event is something that happens to your application—for example, the user presses a key or clicks or drags the mouse—to which the application needs to react.

    The widgets normally have a lot of built-in behaviors. For example, a button will react to a mouse click by calling its command callback. For another example, if you move the focus to an entry widget and press a letter, that letter gets added to the content of the widget........
    Beaucoup de blabla, la suite ...pareil... ah ! voilà : http://infohost.nmt.edu/tcc/help/pub...-handlers.html

    The sections above tell you how to describe what events you want to handle, and how to bind them. Now let us turn to the writing of the handler that will be called when the event actually happens.

    The handler will be passed an Event object that describes what happened. The handler can be either a function or a method. Here is the calling sequence for a regular function:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def handlerName(event):
    And as a method:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        def handlerName(self, event):
    Quand on utilise w.bind("<sequence>", callback) l'événement retourne un objet tkinter.Event à la fonction/méthode appelée, il faut donc l'ajouter dans les paramètres de la fonction appelée.

    Dans votre cas, vous devez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def changeCouleurs(self, event):
    Et ça devrait fonctionner.

    Profitez-en aussi pour remarquer la méthode utilisée pour aller chercher l'info et trouver la réponse, ça pourrait vous servir ultérieurement.

    @+.

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Dans ces cas on fait comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        def changeCouleurs(self, *args):
            print "args:", args
    et tu verras ce qu'est cet argument surnuméraire. Pas la valeur de l'Entry, par hasard ?

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Merci, ca fonctionne bien.
    Une dernière question : avec cette modification la validation par le bouton Montrer ne fonctionne plus puisqu'elle ne passe pas d'argument event.
    Y a t il moyen de conserver les options de validation simultanément ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Tchaé Voir le message
    Merci, ca fonctionne bien.
    Une dernière question : avec cette modification la validation par le bouton Montrer ne fonctionne plus puisqu'elle ne passe pas d'argument event.
    Y a t il moyen de conserver les options de validation simultanément ?
    Oui, il suffit de rendre le paramètre facultatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     def changeCouleurs(self, event=None):
    @+.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 347
    Points : 36 870
    Points
    36 870
    Par défaut
    Citation Envoyé par Tchaé Voir le message
    Merci, ca fonctionne bien.
    Une dernière question : avec cette modification la validation par le bouton Montrer ne fonctionne plus puisqu'elle ne passe pas d'argument event.
    Y a t il moyen de conserver les options de validation simultanément ?
    autre méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                Button(self.root, text='Montrer', command=self.changeCouleurs).grid(row=3, column=1)
                ...
                self.entree.bind('<Return>', lambda e: self.changeCouleurs())
                ...
    on ne change pas la fonction initiale, mais on fabrique une nouvelle fonction (lamba) qui gobe l'event.

    - W

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

Discussions similaires

  1. Valider listview avec touche Enter
    Par HeB91 dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 18/07/2012, 15h06
  2. valider formulaire avec touche entrée
    Par dimainfo dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/10/2009, 16h30
  3. [AJAX] Valider formulaire avec touche Entrer
    Par sff dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/09/2008, 13h36
  4. [C#] Changer le focus avec la touche return
    Par sblanc74 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/10/2003, 18h38

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