Aide Python (facile)

[Fermé]
Signaler
Messages postés
254
Date d'inscription
vendredi 4 mars 2011
Statut
Membre
Dernière intervention
30 décembre 2016
-
 Utilisateur anonyme -
Bonjour,

J'essaye de faire un programme tout simple mais je suis coincé, je ne trouve pas mon erreur, donc j'ai cherché et j'ai que cela venait du fait que j'ais mis un .set dans une condition if.
Si vous auriez de l'aide ^^
Merci

from tkinter import *
import random

wind = Tk()

r = random.randint(1,2)
molec = StringVar()

if r == 1:
    molec.set('CH3-CH2-CH2-CH3')
elif r == 2:
    molec.set('CH3-CH2-OH')

lbl_molec = Label(wind, textvariable = molec)
lbl_molec.pack()

rep_alcane = IntVar()
rep_alcool = IntVar()

rep = IntVar()
def rep_alcane():
    rep.set(1)
def rep_alcool():
    rep.set(2)

b_alcane = Button(wind, text = 'Alcane', command = rep_alcane)
b_alcane.pack()
b_alcool = Button(wind, text = 'Alcool', command = rep_alcool)
b_alcool.pack()

status = StringVar()

if rep == 1 and r == 1:
    status.set("Gagné")
elif rep == 2 and r == 2:
    status.set("Perdu")

lbl_status = Label(wind, textvariable = status)
lbl_status.pack()

wind.mainloop()


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

1 réponse


Salut,

Le problème, c'est que tu regardes la réponse de l'utilisateur au mauvais moment. En fait, dans ton programme c'est fait après la création de tes deux boutons (et avant l'affichage de la fenêtre).

Pour mieux faire, il faut mettre ce bloc :
if rep == 1 and r == 1:
    status.set("Gagné")
elif rep == 2 and r == 2:
    status.set("Perdu")


dans les fonctions :
def rep_alcane():
    rep.set(1)
def rep_alcool():
    rep.set(2)


A noter que ta variable "rep" ne sert donc pas à grand chose (si tu le vois pas, c'est pas bien grave).
Messages postés
254
Date d'inscription
vendredi 4 mars 2011
Statut
Membre
Dernière intervention
30 décembre 2016
70
Merci beaucoup, maintenant mon programme marche, mais je n'ai toujours pas compris mon erreur d'organisation (oui je suis un peu débile)

Mon changement :
status = StringVar()
def rep_alcane():
    if  r == 1:
        status.set("Gagné")
    else:
        status.set("Perdu")

def rep_alcool():
    if  r == 2:
        status.set("Gagné")
    else:
        status.set("Perdu")    
>
Messages postés
254
Date d'inscription
vendredi 4 mars 2011
Statut
Membre
Dernière intervention
30 décembre 2016

Tu n'as pas besoin de deux fonctions pour faire la même chose, un lambda et le tour est joué.

from tkinter import *
import random

wind = Tk()

r = random.randint(1,2)
molec = StringVar()

if r == 1:
molec.set('CH3-CH2-CH2-CH3')
elif r == 2:
molec.set('CH3-CH2-OH')

lbl_molec = Label(wind, textvariable = molec)
lbl_molec.pack()

status = StringVar()

def show_result(number) :
result = 'Gagné' if number == r else 'Perdu'
status.set(result)

b_alcane = Button(wind, text = 'Alcane', command = lambda : show_result(1))
b_alcane.pack()
b_alcool = Button(wind, text = 'Alcool', command = lambda : show_result(2))
b_alcool.pack()

lbl_status = Label(wind, textvariable = status)
lbl_status.pack()

wind.mainloop()


C'est beaucoup plus clair ainsi.
Utilisateur anonyme > dibot
Il faut te dire que ton programme s'exécute dans un premier temps ligne par ligne en commençant du début. Toutes les fonctions ne sont tenues en compte qu'à leur appel ! En particulier, les deux fonctions que tu as modifié sont appelées lorsque l'utilisateur appuie sur un bouton. Or, comme ton programme s'exécute ligne par ligne, entre =Tk() et .mainloop() il est en train de créer ta fenêtre. A ce moment-là l'utilisateur ne peut pas interagir avec la fenêtre. Cependant, tu as mis le code correspondant au choix de l'utilisateur à l'endroit où la fenêtre se créée.

C'est pour ça qu'il faut que tu mettes ce code dans une fonction car elle sera appelée quand l'utilisateur appuiera effectivement sur un bouton.