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 :

Bouton permettant d'afficher 2 labels


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Par défaut Bouton permettant d'afficher 2 labels
    Bonjour à tous, voici mon souci :

    def roulerchambre():
    c = Frame(root)
    choix2 = Button(c, text="Tourner la chambre", command=labelTourner)
    labelTourner = Label(c, text="Vous tournez la chambre...")
    time.sleep(4)
    labelTourner.config(text="Chambre tournée !")
    choix2.pack()
    labelTourner.pack()
    c.pack()

    Ici, je cherche à créer une fonction qui retourne une phrase (label) pendant 4 secondes puis en retourne une autre juste après. Mais "command=labelTourner" n'est pas considéré comme un code correct par le compilateur (local variable 'labelTourner' referenced before assignment). Comment dois-je faire svp ?

    Par ailleurs si vous en avez le temps et l'envie :

    def tirer():
    c = Frame(root)
    choix1 = Button(c, text="Tirer", command=hasard(tirer))
    choix1.grid(column=6, columnspan=2, row=35, sticky="NSEW")
    choix1.pack()
    c.pack()

    def hasard(event):
    listeBruits = ["CLICK !", "BOOM !", "CLACK !", "CLYCK !", "CLOCK !", "CLUCK !"]
    global tirer
    tirer = random.shuffle(listeBruits)
    texte = str(listeBruits)
    return texte

    Ici, je souhaite créer un bouton "Tirer" qui, dès qu'on clique dessus, retourne/affiche l'une des chaînes de caractères au hasard stockée dans "listeBruits". Pouvez-vous me dire si mon code est correct ? Mon terminal m'indique qu'ici tout est correct, j'ai mon bouton Tirer mais ..... il ne fait rien mon bouton

    Voilà ! En l'attente de réponses de votre part !

  2. #2
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def hasard():
        listeBruits = ["CLICK !", "BOOM !", "CLACK !", "CLYCK !", "CLOCK !", "CLUCK !"]
        random.shuffle(listeBruits)
        texte = str(listeBruits[0])
        return texte
    là tu extrait dans ce cas la première entrée de listeBruits, une fois celle ci mélangée avec random.shuffle. Mais je sortirais listBruits de la fonction pour devenir une global ce qui aura pour effet de mélanger la dernière version de listBruit et non de la réinitialisée a chaque fois, vu que ca sert a rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    listeBruits = ["CLICK !", "BOOM !", "CLACK !", "CLYCK !", "CLOCK !", "CLUCK !"]
    def hasard():
        
        random.shuffle(listeBruits)
        texte = str(listeBruits[0])
        print texte #ici ca permet d'afficher la valeur dans ta console sinon tu ne verra rien, car l'appel a hasard() dans la fonction ci dessous ne prévoit pas d'affichage !!
        return texte
    
    def tirer():
        c = Frame(root)
        choix1 = Button(c, text="Tirer", command=hasard())
        choix1.grid(column=6, columnspan=2, row=35, sticky="NSEW")
        choix1.pack()
        c.pack()

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Par défaut
    Ok cela me semble un peu plus clair. Quoique je doute que le "print texte" soit très utile, étant donné le fait que mon projet tKinter est un jeu de Roulette Russe avec 2 options (ou boutons) : Tirer / Rouler la chambre du revolver et que donc par conséquent, l'utilisateur n'est pas obligé de voir un bruit de ses propres yeux . C'est laissé à l'appréciation de l'utilisateur en question.

    Quoi qu'il en soit, merci de ta participation airod. Tant que j'y suis, tu n'aurais pas une idée pour la fonction roulerchambre() ?

  4. #4
    Membre Expert 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
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def roulerchambre():
        c = Frame(root)
        choix2 = Button(c, text="Tourner la chambre", command=lambda: root.after(2400, lambda: labelTourner.config(text="Chambre tournée !"))) # En ms
        labelTourner = Label(c, text="Vous tournez la chambre...")
        choix2.pack()
        labelTourner.pack()
        c.pack()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def tirer():
        c = Frame(root)
        choix1 = Button(c, text="Tirer", command=hasard())
        choix1.grid(column=6, columnspan=2, row=35, sticky="NSEW")
        choix1.pack()
        c.pack()
    On ne mélange pas les gestionnaires de géométrie pour un même niveau (Comprendre ici la Frame c)

    local variable 'labelTourner' referenced before assignment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    choix2 = Button(c, text="Tourner la chambre", command=labelTourner)
    labelTourner = Label(c, text="Vous tournez la chambre...")
    Comment voulez vous que Python connaisse labelTourner lors de la création de choix2 si vous le déclarez après ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    choix1 = Button(c, text="Tirer", command=hasard(tirer))
    Ici hasard(tirer) est exécuter lors de la création du Widget (de même que command=hasard()).
    Pour éviter cela utilisez lambda.

    Etc...

    @+

    Edit
    Pensez à la balise CODE (#)
    Lorsque vous aurez revu votre code essayer de vous passer de global. C'est un bon exercice pour comprendre la portée de variables.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Par défaut
    Ok merci PauseKawa, j'ai modifié certaines choses dans mon programme et voilà ce que ça donne au final :

    root = Tk()
    root.title('Jeu de Roulette Russe')

    listeBruits = ["CLICK !", "BOOM !", "CLACK !", "CLYCK !", "CLOCK !", "CLUCK !"]

    def hasard():
    random.shuffle(listeBruits)
    texte = str(listeBruits[0])
    return texte

    def tirer():
    c = Frame(root)
    choix1 = Button(c, text="Tirer", command=lambda: hasard())
    choix1.pack(side=LEFT)
    c.pack()

    def roulerchambre():
    c = Frame(root)
    labelTourner = Label(c, text="Vous tournez la chambre ...")
    choix2 = Button(c, text="Tourner la chambre", command=lambda: root.after(2400, lambda: labelTourner.config(text="Chambre tournée !")))
    choix2.pack(side=RIGHT)
    labelTourner.pack(side=BOTTOM)
    c.pack()

    def calculscore():
    score = 0
    score = score + 1
    return score

    def scorefinal():
    return score

    def quitter(event):
    quitter = Tk()
    quitter.title('Quitter la Partie')
    labelScore = Label(quitter,text="Votre score actuel : ", command=lambda : scorefinal(), fg='red')
    labelChoix = Label(quitter,text="Souhaitez-vous quitter le jeu maintenant ?",fg='red')
    quitterOui = Button(quitter,text="Oui",command=root.quit)
    quitterNon = Button(quitter,text="Non",command=quitter.destroy)
    labelScore.pack()
    labelChoix.pack()
    quitterOui.pack(side=LEFT)
    quitterNon.pack(side=RIGHT)
    quitter.pack()
    quitter.mainloop()

    def jeu():
    partie_en_cours = True
    Joueur_mort = False
    while partie_en_cours:
    global score
    tirer()
    roulerchambre()
    if (tirer != "BOOM !"):
    labelSauf = Label(root,text="INDEMNE ! Vous marquez un point !",fg='green')
    labelScoreJoueur = Label(root,text="Score actuel :", command=lambda : calculscore())
    labelSauf.pack(side=LEFT)
    labelScoreJoueur.pack(side=LEFT)
    if (tirer == "BOOM !"):
    labelMort1 = Label(root,text="BOOM HEADSHOT ! Vous êtes mort ...",fg='red')
    labelMort1.pack(side=MIDDLE)
    time.sleep(3)
    labelMort2 = Label(root,text="GAME OVER",fg='red')
    labelMort2.pack(side=MIDDLE)
    time.sleep(1)
    labelMort3 = Label(root,text="Votre score final :", command=lambda : scorefinal())
    labelMort3.pack(side=MIDDLE)
    time.sleep(2)
    Joueur_mort = True
    if Joueur_mort:
    partie_en_cours = False
    else:
    quitter(jeu)

    On ne voit ici que le fonctionnement du jeu (je n'ai pas rajouté ce qui concerne l'affichage). Il persiste encore 2-3 problèmes : labelTourner s'affiche déjà lorsque je fais une nouvelle partie alors qu'il ne devrait s'afficher que quand je clique sur le bouton "Tourner la chambre";
    Mon appel de fonction calculscore() ne fonctionne pas;
    Même chose pour scorefinal() mais le problème est le même pour ces deux-là.

    Le bouton "Tourner la chambre", lorsqu'on clique dessus, doit afficher d'abord dans un premier temps la phrase "Vous tournez la chambre ..." pendant 4 secondes puis doit être supprimée et remplacée par "Chambre tournée !" pendant 3 secondes (ou 4 peu importe) au même emplacement puis ensuite supprimée.

    Comment je dois procéder svp ?

    PS : Code avec balise juste en dessous.

  6. #6
    Membre Expert 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
    Par défaut
    Avec les balises code svp

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Par défaut
    Ok merci PauseKawa, j'ai modifié certaines choses dans mon programme et voilà ce que ça donne au final :

    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
    66
    67
    68
    69
    70
    71
    72
    73
    root = Tk()
    root.title('Jeu de Roulette Russe')
     
    listeBruits = ["CLICK !", "BOOM !", "CLACK !", "CLYCK !", "CLOCK !", "CLUCK !"]
     
    def hasard():
        random.shuffle(listeBruits)
        texte = str(listeBruits[0])
        return texte
     
    def tirer():
        c = Frame(root)
        choix1 = Button(c, text="Tirer", command=lambda: hasard())
        choix1.pack(side=LEFT)
        c.pack()
     
    def roulerchambre():
        c = Frame(root)
        labelTourner = Label(c, text="Vous tournez la chambre ...")
        choix2 = Button(c, text="Tourner la chambre", command=lambda: root.after(2400, lambda: labelTourner.config(text="Chambre tournée !")))
        choix2.pack(side=RIGHT)
        labelTourner.pack(side=BOTTOM)
        c.pack()
     
    def calculscore():
        score = 0
        score = score + 1
        return score
     
    def scorefinal():
        return score
     
    def quitter(event):
        quitter = Tk()
        quitter.title('Quitter la Partie')
        labelScore = Label(quitter,text="Votre score actuel : ", command=lambda : scorefinal(), fg='red')
        labelChoix = Label(quitter,text="Souhaitez-vous quitter le jeu maintenant ?",fg='red')
        quitterOui = Button(quitter,text="Oui",command=root.quit)
        quitterNon = Button(quitter,text="Non",command=quitter.destroy)
        labelScore.pack()
        labelChoix.pack()
        quitterOui.pack(side=LEFT)
        quitterNon.pack(side=RIGHT)
        quitter.pack()
        quitter.mainloop()
     
    def jeu():
        partie_en_cours = True
        Joueur_mort = False
        while partie_en_cours:
            global score
            tirer()
            roulerchambre()
            if (tirer != "BOOM !"):
                labelSauf = Label(root,text="INDEMNE ! Vous marquez un point !",fg='green')
                labelScoreJoueur = Label(root,text="Score actuel :", command=lambda : calculscore())
                labelSauf.pack(side=LEFT)
                labelScoreJoueur.pack(side=LEFT)
            if (tirer == "BOOM !"):
                labelMort1 = Label(root,text="BOOM HEADSHOT ! Vous êtes mort ...",fg='red')
                labelMort1.pack(side=MIDDLE)
                time.sleep(3)
                labelMort2 = Label(root,text="GAME OVER",fg='red')
                labelMort2.pack(side=MIDDLE)
                time.sleep(1)
                labelMort3 = Label(root,text="Votre score final :", command=lambda : scorefinal())
                labelMort3.pack(side=MIDDLE)
                time.sleep(2)
                Joueur_mort = True
            if Joueur_mort:
                partie_en_cours = False
            else:
                quitter(jeu)
    On ne voit ici que le fonctionnement du jeu (je n'ai pas rajouté ce qui concerne l'affichage). Il persiste encore 2-3 problèmes : labelTourner s'affiche déjà lorsque je fais une nouvelle partie alors qu'il ne devrait s'afficher que quand je clique sur le bouton "Tourner la chambre";
    Mon appel de fonction calculscore() ne fonctionne pas;
    Même chose pour scorefinal() mais le problème est le même pour ces deux-là.

    Le bouton "Tourner la chambre", lorsqu'on clique dessus, doit afficher d'abord dans un premier temps la phrase "Vous tournez la chambre ..." pendant 4 secondes puis doit être supprimée et remplacée par "Chambre tournée !" pendant 3 secondes (ou 4 peu importe) au même emplacement puis ensuite supprimée.

    Comment je dois procéder svp ?

Discussions similaires

  1. [GTK+ 3][C] label centré + bouton qui s'affiche pas
    Par kripteks dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 20/10/2014, 17h03
  2. bouton permettant d'afficher une zone de texte
    Par mioke dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 11/12/2008, 17h46
  3. bouton image pour afficher du texte
    Par froggies dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 12h09
  4. [VC++ 6] Boutons permettant d'afficher une form
    Par cooladn dans le forum MFC
    Réponses: 3
    Dernier message: 09/12/2004, 16h17
  5. Fonction permettant d'afficher le chemin d'un fichier
    Par kilinette dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2004, 10h52

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