Problème programmation variable TkInter
Résolu
Bonjour à tous ceux passant ici et merci de prendre le temps de m'aider,
J'ai programmé un programme simple d'un Snake. Tout fonctionne, sauf une chose dans ma fenêtre Tkinter : j'ai une variable
Voici le code :
J'ai programmé un programme simple d'un Snake. Tout fonctionne, sauf une chose dans ma fenêtre Tkinter : j'ai une variable
scoreque je veux utiliser pour afficher le nombre de pommes mangées. La fenêtre affiche
Score :mais pas la valeur de la variable. Si jamais vous pouviez aider, ce serait vraiment sympa.
Voici le code :
import tkinter
from random import*
#Fonction la plus compliquée permettant le déplacement du serpent
def deplacement():
global a,b,z,y,lu,lv,score,serpent,j,m
c=len(serpent)
c=c-1
#Chaque carré reprend la coordonnée du précédent dans la liste (serpent)
while c!=0 :
lu[c]=lu[c-1]
lv[c]=lv[c-1]
c+=-1
#On change les coordonées du premier carré
lu[0] += a
lv[0] += b
c=0
#On applique les nouvelles coordonnées aux carrés correspondant
while c!=len(serpent):
can.coords(serpent[c],lu[c],lv[c],lu[c]+10,lv[c]+10)
c+=1
c=1
#Si les coordonnées du premier carré sont égales à celle d'un autre le jeu s'arrêtera
while c!=len(serpent):
if lu[c]==lu[0] and lv[c]==lv[0]:
j=1
score = 'Perdu avec ' + str(score*10)
sc.set(score)
break
c+=1
#Si le serpent est mord un coté il ressort de l'autre
#La valeur 'd' sert à empecher un bug empechant la transfert du serpent de l'autre coté du canvevas
d=1
if lu[0]==200:
lu[0],d=10,0
if lu[0]==0 and d==1:
lu[0]=200
if lv[0]==200:
lv[0],d=10,0
if lv[0]==0 and d==1:
lv[0]=200
d=0
#Si le carré de tête recoupe le cercle, le score augmente et un nouveau cercle apparait aléatoirement
if z-7<=lu[0]<=z+7 and y-7<=lv[0]<=y+7:
score+=1
sc =(str(score*10))
bestiole()
if j!=1 and m!=1:
fen.after(100,deplacement)
#Cette fonction crée un cercle de coordonée multiple de 10 pour éviter que le cercle soit partiellement coupé par le serpent
def bestiole():
global z,y,n,lu,lv,serpent,a,b
z=randrange(2,18)
y=randrange(2,18)
z = z*10
y = y*10
can.coords(cercle,z,y,z+5,y+5)
#On ajoute un carré hors du canevas (pour allèger le code) qui se rajoutera à la suite
serpents = can.create_rectangle(300,300,310,310,fill='green')
serpent.append(serpents)
lu.append(lu[n]+12+a)
lv.append(lv[n]+12+b)
n+=1
#Ces quatres fonctions permettent le déplacement dans quatres directions du serpent
#Grace aux modifications successives des coordonées du premier carrée grave au valeur a et b
#La valeur s permet de ne pas accelerer la vitesse du serpent ou à modifier ca direction
#en appuyant successivement sur Haut/Bas/Gauche/Droite
def gauche(event):
global a,b,s
a=-10
b=0
if s==0:
s=1
deplacement()
def droite(event):
global a,b,s
a=10
b=0
if s==0:
s=1
deplacement()
def haut(event):
global a,b,s
a=0
b=-10
if s==0:
s=1
deplacement()
def bas(event):
global a,b,s
a=0
b=10
if s==0:
s=1
deplacement()
#Cette fonction permet d'arrêter le serpent
def pause(event):
global j,a,b,m,enpause
t=0
if a==b:
t=1
if j!=1:
#Affichage ou Effacage du texte 'PAUSE'
#Et arrêt du serpent
if m!=1:
m=1
can.coords(enpause,100,100)
else:
m=0
can.coords(enpause,300,300)
if t!=1:
deplacement()
#Cette fonction réinitialise toutes les valeurs et recréée le serpent de base ainsi que le premier repas
def recommencer(event):
global z,y,lu,lv,score,serpent,j,m,s,n,a,b,cercle
if j!=1:
print ('Le suicide est puni')
can.delete("all")
s=score=j=m=a=b=0
z=y=50
lu,lv,serpent = [100,112],[100,112],[]
n=1
tete = can.create_rectangle(100,100,110,110,fill='dark green')
carre = can.create_rectangle(112,100,122,110,fill='green')
cercle = can.create_oval(z,y,z+5,y+5,fill='red')
serpent.append(tete)
serpent.append(carre)
sc.set('0')
#On définit les valeurs initiales
s=score=j=m=t=a=b=0
z=y=50
lu,lv,serpent = [100,112],[100,112],[]
n=1
print (' '*35 + 'ZQSD pour bouger')
print (' '*35 + 'P pour mettre/enlever la pause')
print (' '*35 + 'E pour recommencer, attention au suicide')
#On crée un canevas tout gris
fen = tkinter.Tk()
can = tkinter.Canvas(fen,width = 200, height = 200 , bg = 'gray')
can.grid(row=1,column=0,columnspan=3)
enpause=can.create_text(300,300,text="PAUSE")
#On crée la base du serpent ainsi que le premier repas
tete = can.create_rectangle(100,100,110,110,fill='dark green')
carre = can.create_rectangle(112,100,122,110,fill='green')
cercle = can.create_oval(z,y,z+5,y+5,fill='red')
serpent.append(tete)
serpent.append(carre)
#On crée les commandes au clavier
can.bind_all('<z>', haut)
can.bind_all('<s>', bas)
can.bind_all('<q>', gauche)
can.bind_all('<d>', droite)
can.bind_all('<e>',recommencer)
can.bind_all('p',pause)
#L'affichage du score
tkinter.Label(fen, text='Score: ').grid(row=0,column=0)
sc = StringVar()
Score = Entry(fen, textvariable=scores)
Score.grid(row=0,column=1)
sc.set('0')
fen.mainloop()
A voir également:
- Problème programmation variable TkInter
- Application de programmation - Guide
- Le fichier contient un programme écrit en python. le programme construit un mot secret mais il ne l'affiche pas. modifiez ce programme afin que à chaque itération de la boucle : la variable a augmente de 2 la variable b diminue de 1 ajoutez une instruction pour faire afficher le mot secret construit. quel est ce mot secret ? ✓ - Forum Python
- Définir des variables par itération ✓ - Forum Python
- Variable d'environnement temp - Forum Word
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret? ✓ - Forum Python
2 réponses
Bonjour,
Merci de soigner l'orthographe et d'utiliser les balises de code quand tu écris un message.
Cette instruction
Concernant ton code, je recommande :
Bonne chance
Merci de soigner l'orthographe et d'utiliser les balises de code quand tu écris un message.
Cette instruction
tkinter.Label(fen, text='Score: ').grid(row=0,column=0)n'implique pas ta variable
scorequi mémorise le score, elle ne peut donc pas l'afficher. Il faudrait par exemple écrire :
tkinter.Label(fen, text=f'Score: {score}').grid(row=0,column=0)
Concernant ton code, je recommande :
- de suivre les recommandation PEP8 pour avoir code propre (espace autour des opérateur, espace derrière les virgules ;
- d'éviter les variables globales (c'est une mauvaise habitude de programmation) car cela nuit à la lisibilité du code et posera des problème quand des notions plus avancées en programmation (notamment la parallélisation) ;
- d'utiliser des noms de variables plus parlants.
Bonne chance
merci de votre réponse alors oui au niveau de l'instruction la variable de score s'affiche mais cette dernière reste bloqué à 0 à voir je pense que c'est un problème dans ma définition de score.
Update : J'ai juste mis l'instance dans ma boucle ceux qui est logique sinon elle ne peux pas s'actualiser.
Update : J'ai juste mis l'instance dans ma boucle ceux qui est logique sinon elle ne peux pas s'actualiser.