Aide Python (facile)

Fermé
Icsy-Watermelon Messages postés 253 Date d'inscription vendredi 4 mars 2011 Statut Membre Dernière intervention 30 décembre 2016 - Modifié par baladur13 le 30/09/2016 à 18:57
 Utilisateur anonyme - 1 oct. 2016 à 16:20
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

Utilisateur anonyme
30 sept. 2016 à 20:00
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).
0
Icsy-Watermelon Messages postés 253 Date d'inscription vendredi 4 mars 2011 Statut Membre Dernière intervention 30 décembre 2016 70
Modifié par baladur13 le 30/09/2016 à 20:46
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")    
0
dibot > Icsy-Watermelon Messages postés 253 Date d'inscription vendredi 4 mars 2011 Statut Membre Dernière intervention 30 décembre 2016
30 sept. 2016 à 21:32
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.
0
Utilisateur anonyme > dibot
1 oct. 2016 à 16:20
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.
0