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 :

[Tkinter] Renvoyer une variable avec un button


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Par défaut [Tkinter] Renvoyer une variable avec un button
    Salut à tous !

    C'est encore moi ..

    Je post ici car j'ai une question. Peut on renvoyer une variable avec un bouton ? Par exemple : Bouton1 = Button(Mafenetre, text ='1', command = allumette = 1) ?

    J'explique brièvement, je fais un programme de jeu de NIM dans le cadre de la spécialité ISN. Le jeu de NIM est un jeu dans lequel au tour à tour on prend un nombre d'allumette défini entre 1 et 4. Le dernier qui prend l'allumette à perdu. DOnc pour mon programme j'ai besoin que lorsqu'on clique sur un bouton une variable prenne le nombre d'allumette choisi. J'ai donc fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def boutons():
        global Bouton1 , Bouton2 , Bouton3 , Bouton4 , texte
        global Bouton
        Bouton = True
        texte = Label(text="Combien d'allumettes voulez vous prendre ? : ")
        texte.pack(side = LEFT , padx=10 , pady=10)
        Bouton1 = Button(Mafenetre, text ='1', command = choixallu1)
        Bouton1.pack(side = LEFT, padx = 5, pady = 5)
        Bouton2 = Button(Mafenetre, text ='2', command = choixallu2)
        Bouton2.pack(side = LEFT, padx = 5, pady = 5)
        Bouton3 = Button(Mafenetre, text ='3', command = choixallu3)
        Bouton3.pack(side = LEFT, padx = 5, pady = 5)
        Bouton4 = Button(Mafenetre, text ='4', command = choixallu4)
        Bouton4.pack(side = LEFT, padx = 5, pady = 5)
    Qui renvoi aux fonctions suivantes :

    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
    def choixallu1():
        nombre_allumettes_joueur = 1
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 1 allumette !")
        return nombre_allumettes_joueur
     
    def choixallu2():
        nombre_allumettes_joueur = 2
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 2 allumettes !")
        return nombre_allumettes_joueur
     
    def choixallu3():
        nombre_allumettes_joueur = 3
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 3 allumettes !")
        return nombre_allumettes_joueur
     
    def choixallu4():
        nombre_allumettes_joueur = 4
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 4 allumettes !")
        return nombre_allumettes_joueur
    Et que j'ai inclu dans cette boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def mode2joueurs():
        if Bouton :
            destroy()
        if Presence_allu :
            delete_allu()
        texturejeu()
        boutons()
        nombre_allumettes = 21
        while nombre_allumettes >= 0 :
            allu(nombre_allumettes)
            #Comment recevoir les valeurs des boutons ??
            nombre_allumettes = nombre_allumettes - nombre_allumettes_joueur
    La fonction allu() me sert a afficher les allumettes à l'écran.
    J'ai donc besoin de récupérer les valeurs des boutons dans la variable nombre_allumette_joueur ...
    Comment puis je faire ?

    Cordialement

    Zl4T

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Zl4T_59 Voir le message
    Salut à tous !

    C'est encore moi ..

    Je post ici car j'ai une question. Peut on renvoyer une variable avec un bouton ? Par exemple : Bouton1 = Button(Mafenetre, text ='1', command = allumette = 1) ?
    Bonjour,

    non, avec l'objet Button() vous ne pouvez pas exploiter une variable de contrôle pour effectuer un choix.

    en revanche, vous avez l'objet Radiobutton() qui vous le permet.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    from tkinter import messagebox
     
    def afficher_valeur ():
        messagebox.showinfo(
            "info",
            "Vous avez choisi {} allumette(s)".format(choix.get()),
        )
        choix.set(0)
    # end def
     
     
    Mafenetre = Tk()
     
    Label(
     
        Mafenetre,
        text="Veuillez sélectionner un nombre d'allumettes :",
     
    ).pack(side=TOP, padx=5, pady=5)
     
    choix = IntVar()
     
    for numero in range(1, 5):
     
        Radiobutton(
            Mafenetre,
            text=str(numero),
            variable=choix,
            value=str(numero),
            command=afficher_valeur,
            indicatoron=0,
        ).pack(side=LEFT, padx=5, pady=5, ipadx=5)
     
    # end for
     
    Mafenetre.mainloop()
    J'explique brièvement, je fais un programme de jeu de NIM dans le cadre de la spécialité ISN. Le jeu de NIM est un jeu dans lequel au tour à tour on prend un nombre d'allumette défini entre 1 et 4. Le dernier qui prend l'allumette à perdu. DOnc pour mon programme j'ai besoin que lorsqu'on clique sur un bouton une variable prenne le nombre d'allumette choisi. J'ai donc fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def boutons():
        global Bouton1 , Bouton2 , Bouton3 , Bouton4 , texte
        global Bouton
        Bouton = True
        texte = Label(text="Combien d'allumettes voulez vous prendre ? : ")
        texte.pack(side = LEFT , padx=10 , pady=10)
        Bouton1 = Button(Mafenetre, text ='1', command = choixallu1)
        Bouton1.pack(side = LEFT, padx = 5, pady = 5)
        Bouton2 = Button(Mafenetre, text ='2', command = choixallu2)
        Bouton2.pack(side = LEFT, padx = 5, pady = 5)
        Bouton3 = Button(Mafenetre, text ='3', command = choixallu3)
        Bouton3.pack(side = LEFT, padx = 5, pady = 5)
        Bouton4 = Button(Mafenetre, text ='4', command = choixallu4)
        Bouton4.pack(side = LEFT, padx = 5, pady = 5)
    Qui renvoi aux fonctions suivantes :

    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
    def choixallu1():
        nombre_allumettes_joueur = 1
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 1 allumette !")
        return nombre_allumettes_joueur
     
    def choixallu2():
        nombre_allumettes_joueur = 2
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 2 allumettes !")
        return nombre_allumettes_joueur
     
    def choixallu3():
        nombre_allumettes_joueur = 3
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 3 allumettes !")
        return nombre_allumettes_joueur
     
    def choixallu4():
        nombre_allumettes_joueur = 4
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 4 allumettes !")
        return nombre_allumettes_joueur
    Et que j'ai inclu dans cette boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def mode2joueurs():
        if Bouton :
            destroy()
        if Presence_allu :
            delete_allu()
        texturejeu()
        boutons()
        nombre_allumettes = 21
        while nombre_allumettes >= 0 :
            allu(nombre_allumettes)
            #Comment recevoir les valeurs des boutons ??
            nombre_allumettes = nombre_allumettes - nombre_allumettes_joueur
    La fonction allu() me sert a afficher les allumettes à l'écran.
    J'ai donc besoin de récupérer les valeurs des boutons dans la variable nombre_allumette_joueur ...
    Comment puis je faire ?

    Cordialement

    Zl4T
    la boucle Mafenetre.mainloop(), c'est votre boucle principale de programme - et donc de jeu. Si vous créez une autre boucle de contrôle du programme à l'intérieur de mainloop() e.g. while nombre_allumettes >= 0 vous allez bloquer le gestionnaire d'événements de Mafenetre.mainloop() et plus rien ne réagira aux clics souris.

    Vous devez apprendre à composer avec mainloop(), à "faire avec", et à bien réfléchir comment chaque événement (clic souris, appui touche clavier, etc) doit se répartir dans votre programme.

    Pour chaque interaction de l'utilisateur, prévoyez une fonction qui réponde aux besoins (si utilisateur clique, appeler telle ou telle fonction, etc).

    Programmer en interface graphique demande de penser "événements" sous forme de pleins de petites fonctions de-ci de-là, plutôt que programmation linéaire avec un début, un milieu et une fin en un seul bloc.

    @+

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Par défaut
    D'accord ! Merci pour votre réponse !

    Cependant j'ai une question, qu'est ce que intvar() :


  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Zl4T_59 Voir le message
    D'accord ! Merci pour votre réponse !

    Cependant j'ai une question, qu'est ce que intvar() :

    Documentation officielle de Tkinter (à toujours avoir sous le coude quand on programme avec Tkinter) :

    http://infohost.nmt.edu/tcc/help/pub...variables.html

    http://infohost.nmt.edu/tcc/help/pub...web/index.html

    @+.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,

    Pourquoi ne pas faire de nombre_allumettes_joueur une variable "globale":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def choixallu1():
        global nombre_allumettes_joueur
     
        nombre_allumettes_joueur = 1
        tkinter.messagebox.showinfo("Allumettes","Vous prenez 1 allumette !")
    De fait, les différentes fonctions choixallu1,2,3,4 sont des callbacks.
    On leur donne ce nom car appelées par tkinter lorsque l'utilisateur "clique" sur un bouton, ce qu'elles vont retourner sera retourné à l'appelant (tkinter): leur valeur de retour ne pourra pas être exploitée par votre code.

    Côté code, s'il y a quelque chose à changer, ce serait supprimer les répétitions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def choixallu(n):
        global nombre_allumettes_joueur
     
        nombre_allumettes_joueur = n
        if n == 1:
              tkinter.messagebox.showinfo("Allumettes","Vous prenez 1 allumette !")
        else:
              tkinter.messagebox.showinfo("Allumettes","Vous prenez %d allumettes !" % n)
    Puis côté construction des Buttons:
    Remplacer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Bouton1 = Button(Mafenetre, text ='1', command = choixallu1)
        Bouton1.pack(isde = LEFT, padx = 5, pady = 5)
        Bouton2 = Button(Mafenetre, text ='2', command = choixallu2)
        Bouton2.pack(side = LEFT, padx = 5, pady = 5)
        Bouton3 = Button(Mafenetre, text ='3', command = choixallu3)
        Bouton3.pack(side = LEFT, padx = 5, pady = 5)
        Bouton4 = Button(Mafenetre, text ='4', command = choixallu4)
        Bouton4.pack(side = LEFT, padx = 5, pady = 5)
    Par une boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for ix in range(1, 5):
             b = Button(Mafenetre, text ='%d' % ix , command= lambda n=ix: choixallu(n))
             b.pack(side = LEFT, padx = 5, pady = 5)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/05/2006, 16h00
  2. Réponses: 7
    Dernier message: 13/03/2006, 15h39
  3. [Variable] Déclarer une variable avec un nom dynamique
    Par jacquesh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/02/2006, 14h11
  4. Utilisation d'une variable avec l'instruction 'USE'
    Par florantanplan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/11/2005, 10h39
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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