Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm

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