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

Python Discussion :

Problème de commandes sur Tkinter (Python)


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème de commandes sur Tkinter (Python)
    Bonjour à tous.

    Je dois créer un programme avec une interface graphique, mais j'ai un gos problème avec les boutons. En effet, la commande que je leur ait assigné s'execute lors de la création du bouton, et non lorsque l'on clique dessus...
    Voici mon code:


    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
    from tkinter import *
    Mise=0
    
    def FonctionMise(Valeur): #ma fonction. Je ne suis pas sur que le global serve à quoi que ce sot puisque je défini 'Mise' avant...
        global Mise
        Mise=Mise+int(Valeur)
    
    
    ValeurJetons=[None,"1","10","50","100","500","1000"] #Le nom de mes Jetons. Ce sera utilisé comme argument de la fonction
    ImagesJetons=[None,"1","10","50","100","500","1000"] #Les images associées à mes boutons. 
    buttonJeton=[None] #La liste qui comprendra mes 6 boutons, quand ils seront crées.
    
    for i in range (1,7):
        ImagesJetons[i]=PhotoImage(file="Images/Jeton"+ImagesJetons[i]+".gif")  #Je crée mes PhotoImages à partir de mes fichiers .gif
        buttonJeton.append(Button(Cadre, image=ImagesJetons[i], command=FonctionMise(ValeurJetons[i])))  #Je crée mes boutons avec mes PhotoImages. La commande, c'est ma fonction avec 'ValeurJetons[i]' comme arg.
        buttonJeton[i].pack(side=LEFT)#Meuh

    Ainsi, j'ai six boutons définis ainsi:

    button[1]=Button(Cadre, image=ImageJetons[1], command= FonctionMise(1)) C'est un jeton de 1 euro
    button[2]=Button(Cadre, image=ImageJetons[2], command= FonctionMise(5)) C'est un jeton de 5 euros
    button[3]=Button(Cadre, image=ImageJetons[3], command= FonctionMise(10)) C'est un jeton de 10 euros
    ...
    ...
    button[3]=Button(Cadre, image=ImageJetons[6], command= FonctionMise(1000)) C'est un jeton de 1000 euros



    Mon problème, c'est que lorsque chaque bouton se crée, il exécute immédiatement ma FonctionMise, et il ne veut plus le faire quand je l'utilise...
    Pour le coup, je n'ai aucune idée de quel peut être le problème.

    Je m'en remet donc à vous, merci pour votre aide et bonne journée

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Salut,

    La valeur de ce qu'il faut passer à command dans "Button(..., command=" est la fonction a exécuter lorsqu'on va cliquer sur le bouton. Le soucis est que vous voudriez passer un paramètre à la fonction qui s'exécutera plus tard et non exécuter cette fonction avec ce paramètre maintenant.

    On peut écrire çà ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def FonctionMise(Valeur): 
        def do_it():
            global Mise
            Mise=Mise+int(Valeur)
        return do_it
    - W

  3. #3
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour votre réponse.
    Je testerais cela dès que possible et vous tiendrais informé.

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    J'ai essayé votre méthod, mais je dois avouer qu'il y a quelque chose que je n'ai pas compris. Je devrais avoir, normalement:

    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
     
    from tkinter import *
    Mise=0
     
    def FonctionMise(Valeur): #ma fonction. Je ne suis pas sur que le global serve à quoi que ce sot puisque je défini 'Mise' avant...
        def do_it():
             global Mise
             Mise=Mise+int(Valeur)
        return do_it
     
     
    ValeurJetons=[None,"1","10","50","100","500","1000"] #Le nom de mes Jetons. Ce sera utilisé comme argument de la fonction
    ImagesJetons=[None,"1","10","50","100","500","1000"] #Les images associées à mes boutons. 
    buttonJeton=[None] #La liste qui comprendra mes 6 boutons, quand ils seront crées.
     
    for i in range (1,7):
        ImagesJetons[i]=PhotoImage(file="Images/Jeton"+ImagesJetons[i]+".gif")  #Je crée mes PhotoImages à partir de mes fichiers .gif
        buttonJeton.append(Button(Cadre, image=ImagesJetons[i], command=FonctionMise(ValeurJetons[i])))  #Je crée mes boutons avec mes PhotoImages. La commande, c'est ma fonction avec 'ValeurJetons[i]' comme arg.
        buttonJeton[i].pack(side=LEFT)#Meuh
    Est-ce que je suis censé garder ma 'FonctionMise' en tant que commande? Dois-je enlever l'argument? Ou mettre do_it?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Citation Envoyé par Inariuss Voir le message
    Est-ce que je suis censé garder ma 'FonctionMise' en tant que commande? Dois-je enlever l'argument? Ou mettre do_it?
    Normalement, il n'y a rien a changer.
    Une lecture en diagonale du code que vous avez posté me paraît "correcte".
    Postez un code plus complet et racontez ce que vous espériez.

    - W

Discussions similaires

  1. Problème texte/image sur Tkinter
    Par Dobbraga dans le forum Général Python
    Réponses: 2
    Dernier message: 15/05/2014, 11h56
  2. Problème de Serpent sur Python
    Par NovaVI dans le forum Programmation multimédia/Jeux
    Réponses: 6
    Dernier message: 28/12/2013, 17h21
  3. problème dans l'appel d'une commande Linux dans python
    Par ghadroud dans le forum Général Python
    Réponses: 25
    Dernier message: 20/04/2009, 14h55
  4. problème avec méthode 'constructeur' sur tkinter()
    Par velight dans le forum Tkinter
    Réponses: 8
    Dernier message: 23/02/2009, 11h35

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