Comment exploiter une variable globale dans une procédure déclencher par command
Résolu
cvan85
Messages postés
59
Statut
Membre
-
Phil_1857 Messages postés 1956 Statut Membre -
Phil_1857 Messages postés 1956 Statut Membre -
Bonjour,
je souhaite pouvoir accéder et modifier une variable appelée matrice initialisée dans le programme principal, qui prend ses premières valeurs (1ère ligne de la matrice)dans une procédure: def lancement() et ses valeurs suivantes dans une autre procédure: def autre_tirage().
J'ai visiblement un problème de "visibilité" de ces variables mais je ne vois pas comment je pourrais contourner le problème.
Merci de votre aide
Claude
je souhaite pouvoir accéder et modifier une variable appelée matrice initialisée dans le programme principal, qui prend ses premières valeurs (1ère ligne de la matrice)dans une procédure: def lancement() et ses valeurs suivantes dans une autre procédure: def autre_tirage().
J'ai visiblement un problème de "visibilité" de ces variables mais je ne vois pas comment je pourrais contourner le problème.
Merci de votre aide
Claude
#!/usr/bin/env python3.9
#######################
# #
# Jeu AZ #
# #
#######################
from tkinter import *
import random
import time
###### Définition des fonctions ##############
def aff_widg(canva):
for i in range(5):
for j in range(5):
canva.create_rectangle((40*(i+1),40*(j+1)),((40*(i+1)+40),40*(j+1)+40))
#def maj_palette(co):
#########
# mettre à jour le dico par +1 sur couleur tirée
def sel_coul():
ind=random.randint(1,7)
coul=choix[ind-1]
palette[coul] +=1
return coul
####Début de partie
def lancement():
palette.clear
for c in range(7):
palette[choix[c-1]] = 0
for i in range(5):
couleur=sel_coul()
can_gen.create_rectangle(((40*(i+1),40),((40*(i+1)+40),40+40)), fill=couleur,width=2, outline='black')
lig_courant[i]=couleur
matrice[0]=lig_courant
print ("matrice premier tirage: ",matrice[0] )
#old_lig_courant=lig_courant
Label(can_gen, text= "Pour chaque ligne supplémentaire\n cochez 2 cases et validez",bg='#FEFEE2',fg='blue').place(x=40, y= 310)
def autre_tirage():
global lig_courant
global matrice
ind_mat = 0
nb_case = 0
if (r_v_c1.get()):
nb_case=nb_case + 1
if (r_v_c2.get()):
nb_case=nb_case + 1
if (r_v_c3.get()):
nb_case=nb_case + 1
if (r_v_c4.get()):
nb_case=nb_case + 1
if (r_v_c5.get()):
nb_case=nb_case + 1
if nb_case != 2:
Label(can_gen, text= "Attention ne cochez que 2 cases! " ,bg='#FEFEE2',fg='red').place(x=40, y= 310)
r_v_c1.set(False)
r_v_c2.set(False)
r_v_c3.set(False)
r_v_c4.set(False)
r_v_c5.set(False)
else:
if(matrice[1][0]=='vide'):
print("pemière couleur de la colonne 1 = vide")
lig=2
ind_mat=0
elif (matrice[2][0]=='vide'):
lig=3
ind_mat=1
elif (matrice[3][0]=='vide'):
lig=4
ind_mat=2
elif (matrice[3][0]=='vide'):
lig=5
ind_mat=3
print("Ligne traitée : ", lig)
print ("Ligne 1 de la matrice: ",matrice[0])
print ("Ligne 2 de la matrice: ",matrice[1])
print ("Ligne 3 de la matrice: ",matrice[2])
print ("Ligne 4 de la matrice: ",matrice[3])
print ("Ligne 5 de la matrice: ",matrice[4])
if (r_v_c1.get()):
couleur=sel_coul()
col=1
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
lig_courant[0]=couleur
r_v_c1.set(False)
else:
col=1
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_mat][0],width=2, outline='black')
if (r_v_c2.get()):
couleur=sel_coul()
col=2
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
lig_courant[1]=couleur
r_v_c2.set(False)
else:
col=2
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_mat][1],width=2, outline='black')
if (r_v_c3.get()):
couleur=sel_coul()
col=3
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
lig_courant[2]=couleur
r_v_c3.set(False)
else:
col=3
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_mat][2],width=2, outline='black')
if (r_v_c4.get()):
couleur=sel_coul()
col=4
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
lig_courant[3]=couleur
r_v_c4.set(False)
else:
col=4
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_mat][3],width=2, outline='black')
if (r_v_c5.get()):
couleur=sel_coul()
col=5
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=couleur,width=2, outline='black')
lig_courant[4]=couleur
r_v_c5.set(False)
else:
col=5
can_gen.create_rectangle(((40*(col),40*(lig)),((40*(col)+40),40*(lig)+40)), fill=matrice[ind_mat][4],width=2, outline='black')
matrice[ind_mat]=lig_courant
#old_lig_courant=lig_courant
print ("Matrice après valid: ", matrice[ind_mat])
print ("ind_mat = ",ind_mat)
#print ("old_lig_courant après valid : ",old_lig_courant)
def rien():
return 1
####### Programme principal ######################
# Définitions des variables globales
choix = ['blue','green','red','yellow','purple','pink','white']
palette = {}
lig_courant =['vide','vide','vide','vide','vide']
matrice = [['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide'],['vide','vide','vide','vide','vide']]
####### Début du programme principal #############
fen1=Tk()
fen1.title("Jeu AZ V1.0")
fen1.geometry("420x470")
can_gen=Canvas(fen1, width=360, height=410, bg ="#FEFEE2")
can_gen.place(x=30,y=30)
aff_widg(can_gen)
r_v_c1 = BooleanVar(value=False)
r_v_c2 = BooleanVar(value=False)
r_v_c3 = BooleanVar(value=False)
r_v_c4 = BooleanVar(value=False)
r_v_c5 = BooleanVar(value=False)
c1 = Checkbutton(can_gen, text = "1", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c1).place(x=40,y=280)
c2 = Checkbutton(can_gen, text = "2", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c2).place(x=80,y=280)
c3 = Checkbutton(can_gen, text = "3", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c3).place(x=120,y=280)
c4 = Checkbutton(can_gen, text = "4", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c4).place(x=160,y=280)
c5 = Checkbutton(can_gen, text = "5", height = 2, width = 5,bg ="#FEFEE2",variable= r_v_c5).place(x=200,y=280)
valid = Button(can_gen, text = "Validez", height = 2, width = 7,bg ="#FEFEE2",fg='red',command = autre_tirage).place(x=295,y=280)
Button(can_gen, text='Démarrer\nune partie',bg='#FFE4C4',fg='red',command = lancement).place(x=10, y= 370)
Button(can_gen, text='FIN \nde partie',bg='#AD4F09',fg='red', command = fen1.quit).place(x=250,y=370)
####### Boucle d'attente d'évènements ##############
fen1.mainloop()
####### Effacement fenêtre - Sortie programme ######
fen1.destroy()
####################################################
Configuration: Macintosh / Safari 14.0.1
A voir également:
- Comment exploiter une variable globale dans une procédure déclencher par command
- Sfc scannow command - Guide
- Déclencher appareil photo android à distance - Guide
- Comment déclencher gemini - Accueil - Téléphones
- Comment masquer une commande sur amazon - Guide
- Command mac - Guide
5 réponses
Bonjour,
Ceci mis à part, on peut toujours passer un paramètre à une fonction lancée
par command en utilisant une fonction lambda:
Ceci mis à part, on peut toujours passer un paramètre à une fonction lancée
par command en utilisant une fonction lambda:
def lancement():
........
Button(main_win, text='Démarrer', command=lambda : lancement(mat))
Bonjour Claude,
Dans l'exemple que je t'ai donné, je m'aperçois que j'ai oublié le paramètre de la fonction:
Dans l'exemple que je t'ai donné, je m'aperçois que j'ai oublié le paramètre de la fonction:
def lancement(mat):
........
Bonjour,
Juste le principe sans m'attacher à ton code.
Voir : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/232520-decouvrez-la-portee-des-variables-et-les-references
Donc definir la matrice dans le corps et après modifier la matrice avec une méthode (append, insert, remove, ...)
Juste le principe sans m'attacher à ton code.
Voir : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/232520-decouvrez-la-portee-des-variables-et-les-references
Donc definir la matrice dans le corps et après modifier la matrice avec une méthode (append, insert, remove, ...)
def f1():
print('f1 avant',matrice)
matrice.append([1,2,3])
print('f1 après',matrice)
def f2():
print('f2 avant',matrice)
matrice.append([4,5,6])
print('f2 après',matrice)
# main
matrice=[]
print(matrice)
f1()
print('retour f1',matrice)
f2()
print('retour f2',matrice)
Merci pour ce retour rapide.
Je regarde le contenu de ce lien et je mets en application.
Je reviendrai ici pour fermer le post en cas de résolution.
cdlt,
Claude
Je regarde le contenu de ce lien et je mets en application.
Je reviendrai ici pour fermer le post en cas de résolution.
cdlt,
Claude
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question