#1 Le 03/09/2009, à 14:28
- Pam547
[résolu]Python (Condition "and" et methode after() )
Bonjour
Je suit les exercices du manuel python et don pour le 8.24 je comprend pas quelque chose : Le but est de changer la couleur du disque à chaques fois que ce dernier longe un coté différent du précédent.
J'ai rajouté les 4 premiers # de la fonction move(),
# -*- coding:Utf-8 -*-
from Tkinter import *
from random import randrange
# définition des gestionnaires
# d'événements :
def move():
"déplacement de la balle"
global x1, y1, dx, dy, flag, pal, c, coul,oval1
x1, y1 = x1 +dx, y1 + dy
#coin haut gauche
if (x1==10 and y1==10):
can1.delete(ALL)
c=randrange(8)
coul=pal[c]
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
#coin haut droite
if (x1==210 and y1==10):
can1.delete(ALL)
c=randrange(8)
coul=pal[c]
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
#coin bas droite
if (x1==210 and y1==210):
can1.delete(ALL)
c=randrange(8)
coul=pal[c]
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
#coin bas gauche
if (x1==10 and y1==210):
can1.delete(ALL)
c=randrange(8)
coul=pal[c]
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
if x1 >210:
x1, dx, dy = 210, 0, 15
if y1 >210:
y1, dx, dy = 210, -15, 0
if x1 <10:
x1, dx, dy = 10, 0, -15
if y1 <10:
y1, dx, dy = 10, 15, 0
can1.coords(oval1,x1,y1,x1+30,y1+30)
if flag >0:
fen1.after(50,move) # => boucler après 50 millisecondes
def stop_it():
"arret de l'animation"
global flag
flag =0
def start_it():
"démarrage de l'animation"
global flag
# pour ne lancer qu'une seule boucle
flag =1
move()
#========== Programme principal =============
# les variables suivantes seront utilisées de manière globale :
x1, y1 = 10, 10 # coordonnées initiales
dx, dy = 15, 0 # 'pas' du déplacement
flag =0 # commutateur
pal=['blue','red','yellow','black','green','orange','white','purple']
c=randrange(8)
coul=pal[c]
# Création du widget principal ("parent") :
fen1 = Tk()
fen1.title("Exercice d'animation avec Tkinter")
# création des widgets "enfants" :
can1 = Canvas(fen1,bg='dark grey',height=250, width=250)
can1.pack(side=LEFT, padx =5, pady =5)
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
bou1 = Button(fen1,text='Quitter', width =8, command=fen1.quit)
bou1.pack(side=BOTTOM)
bou2 = Button(fen1, text='Démarrer', width =8, command=start_it)
bou2.pack()
bou3 = Button(fen1, text='Arrêter', width =8, command=stop_it)
bou3.pack()
# démarrage du réceptionnaire d'évènements (boucle principale) :
fen1.mainloop()
donc je fais un print x1,y1 pour connaitre les coordonnées de ces points tout au longt du mouvement. Je suis donc sùr que les 4 couples de point que j'ai entré corresponds à la place du disque à instant t, mais le disque ne change pas de couleur
En revanche en metant les couples (25;10) (210;25) (195;210) et (10;195), le disque change de couleur.
J'me demande pouquoi ?
Merci
Dernière modification par Pam547 (Le 03/09/2009, à 18:08)
Art.9.(code civil) Chacun a droit au respect de sa vie privée.
Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.
Hors ligne
#2 Le 03/09/2009, à 17:27
- kuh
Re : [résolu]Python (Condition "and" et methode after() )
Dans ce cas analysons ce qui ce passe.
en gros move est comme suit:
déplace le point
change de couleurs si nécessaire
change de direction si nécessaire
Donc la balle se déplace en haut vers la droite, (10,10)(25,10)...(205,10)(220,10).
Elle n'as jamais atteint le point haut droite (210,10)
Comme 220 est supérieur à 210, alors elle est mis sur le point (210,10).
Puis, miracle, à la boucle suivante elle se fait déplacer au point (210,25)
Lorsque vient le changement de couleur, elle n'est plus sur(210,10)
Voici l'explication.
Puis 2 remèdes,
1 : Comme tu l'as changer les coordonnées de changement de couleur
2 : déplacer la balle après le changement de couleur, avant le changement de directions
donc déplacer la ligne 9 x1, y1 = x1 +dx, y1 + dy
comme suit :
...
#coin bas gauche
if (x1==10 and y1==210):
can1.delete(ALL)
c=randrange(8)
coul=pal[c]
oval1 = can1.create_oval(x1, y1, x1+30, y1+30, width=2, fill=coul)
x1, y1 = x1 +dx, y1 + dy
if x1 >210:
x1, dx, dy = 210, 0, 15
if y1 >210:
y1, dx, dy = 210, -15, 0
...
environ à la ligne 33 ou 34.
Hors ligne
#3 Le 03/09/2009, à 18:07
- Pam547
Re : [résolu]Python (Condition "and" et methode after() )
Merci beaucoup kuh,
Je me rappelerai dorénavant l'importance des intervals du repère dans lequel évolu le système .
Bonne continuation
Art.9.(code civil) Chacun a droit au respect de sa vie privée.
Art.12.(déclaration universelle des DDH) Nul ne sera l'objet d'immixtions arbitraires dans sa vie privée, sa famille, son domicile ou sa correspondance, ni d'atteintes à son honneur et à sa réputation. Toute personne a droit à la protection de la loi contre de telles immixtions ou de telles atteintes.
Hors ligne