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 :

Command d'un Button sous Tkinter [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Points : 46
    Points
    46
    Par défaut Command d'un Button sous Tkinter
    Bonjour/Bonsoir:

    je travaille en Python (3.6.0) sur la conception d'une interface Tkinter mais je me retrouve face à un problème que je ne parviens pas à résoudre: il s'agit de relever un Entry:
    je dispose de deux Entry dans une classe héritée de Toplevel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            self.champ1=Entry(self,width=30)
            self.champ1.place(x=450,y=300)
     
            self.champ2=Entry(self,width=30)
            self.champ2.place(x=450,y=360)

    et je souhaite relever les valeurs rentrées quand j'appuie sur un Button:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            self.calculer=Button(self,text=labelcalcul,font=("Times",18,"bold"),command= relever_val(self.champ1,self.champ2)) #labelcalcul est un argument du constructeur (à laisser de côté)
            self.calculer.place(x=650,y=320)

    la fonction relever_val de déboggage est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def relever_val(champ1,champ2):
        a=champ1.get()
        b=champ2.get()
        print("a=".format(a)+ "b=".format(b))
    or, des que l'objet hérité de Toplevel est crée, je constate que le Button relève directement les valeurs des Entry puisque je reçois dans ma console:
    a=b=
    Ce message apparaît avant même que j'ai cliqué sur mon Button.
    J'ai cherché sur des forums mais je n'ai pas vu de cas pareils, je me permets donc de poster une demande d'aide.
    Je pense qu'il s'agit encore d'une erreur de ma part mais je ne la rtouve pas.

    Merci de votre aide!


    PS:Je serai indisponible dans les quelques jours qui vont suivre il est donc possible que je ne réponde pas tout de suite.

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Points : 604
    Points
    604
    Par défaut
    Bonjour

    Lors de votre appel à la fonction vous ne devez pas ajouter de ().

    L'appel par command doit etre un callback, pas une fonction.

    Si vous ajoutez les (), votre fonction est exécutée dès le lancement de votre code.

    Pour appeler votre fonction, vous devez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.calculer=Button(self,text=labelcalcul,font=("Times",18,"bold"),command= relever_val)
    Vous ne pouvez donc pas passer de paramètre comme cela à votre fonction.

    Pour que cela fonctionne avec votre "structure", il faut utiliser un fonction lambda. Ce qui donnerait chez vous quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.calculer=Button(self,text=labelcalcul,font=("Times",18,"bold"),command= lambda: relever_val(self.champ1,self.champ2)

    Vous aurez un complément d'information ici

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Entendu, merci de votre aide qui va m'épargner je pense beaucoup de temps!

    Je testerais votre méthode dès que j'en aurai la possibilité, je passe la discussion en résolu car je pense que le problème est résolu; je la ré-ouvrirai s'il le faut.

    Merci de votre aide! Bonne fin de journée!

    Cordialement.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Bonsoir,
    je profite du fait que la discussion soit récente pour rajouter une autre question (désolé) qui suit le contexte initial:
    j'ai pu récupérer mes entry et je les passe comme arguments dans une fonction calculant la somme de deux nombres binaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def addBin(nbrbin1, nbrbin2):
        result = int(bin(int(str(nbrbin1), 2) + int(str(nbrbin2), 2)).replace("0b", ""))
        return result
    fonction qui est appelée par ma fonction relever_val:
    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
     
    def relever_val(champ1,champ2):
        global repere2
        valeur1=champ1.get()
        valeur2=champ2.get()
     
                if repere2==0:
                    label=str(addBin(valeur1,valeur2))
                elif repere==1:                                           #seulement la partie concernant le problème
                    label=str(divBin(valeur1,valeur2))
                elif repere==2:
                    label=str(mulBin(valeur1,valeur2))
                elif repere==3:
                    label=str(sousBin(valeur1,valeur2))
     
                print(rendre_valide(label))
                messagebox.showinfo("Resultat","Resultat="+label)
    fonction qui appelle la fonction rendre_valide:
    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
     
    def rendre_valide(resultat):
        resultat=list(resultat)
        resultat.reverse()
        p = 0
        for p in range (0,8):
            if len(resultat)<2**p:
                break;
     
        while len(resultat)<2**p:
            resultat.append(0)
     
        resultat.reverse()
        resultat= ''.join(str(v) for v in resultat)
        return resultat
    Or, la variable label ne change pas après être passée dans la fonction, je crois que cela est dû au type qui est immuable mais je ne vois pas comment faire pour rajouter des '0' à label sans passer par cette méthode.

    Pourriez-vous s'il vous plaît m'indiquer un chemin à suivre?

    Merci d'avance et bonne soirée.

    Cordialement.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 778
    Points
    36 778
    Par défaut
    Citation Envoyé par Gwynbleidd Voir le message
    Or, la variable label ne change pas après être passée dans la fonction, je crois que cela est dû au type qui est immuable mais je ne vois pas comment faire pour rajouter des '0' à label sans passer par cette méthode.
    Si la variable est associée à un objet "immutable", changer l'objet sera sans effet. Il faut assigner explicitement à la variable le nouvel objet i.e. écrire label = rendre_valide(label).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Quelle erreur de ma part! Lorsque j'avais initialement tapé cette instruction je n'avais pas mis de return dans ma fonction ce qui expliquait le problème...

    Maintenant le code est fonctionnel, merci beaucoup de votre aide à tous!

    Je clôture la discussion.

    Cordialement.

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

Discussions similaires

  1. Commande SYSTEM de awk sous Windows Vista
    Par LouisMarieTls dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 24/12/2007, 16h50
  2. Réponses: 7
    Dernier message: 25/06/2007, 22h34
  3. formats images sous Tkinter
    Par bob29 dans le forum Tkinter
    Réponses: 2
    Dernier message: 05/02/2007, 14h17
  4. utilser les commande d'un programme sous delphi
    Par sanfour_walhan dans le forum Delphi
    Réponses: 5
    Dernier message: 02/08/2006, 18h05
  5. La commande su qui plante sous Ubuntu
    Par adrien357 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 29/06/2006, 12h37

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