Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#1 Le 15/01/2013, à 19:23

brital

[Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Bonjour,
Je suis en train de faire l'exercice 8.28 page 105 du livre de Swinnen "Apprendre à programmer en python3".
Mon problème, je ne sais pas comment faire pour changer la vitesse de la balle...

Voici mon code, la balle rebondi déjà sur les bords du canvas. Qu'en pensez vous? Y a t'il une meilleur façon de faire?

from tkinter import *
from random import randrange
###############################################################################
## Définition locale de fonctions:
def move():
	global x, y, dx, dy, flag, liste
	xp, yp = x, y		# mémorisation des coord. précédentes.
	# déplacement de la balle:
	x = x + dx
	y = y + dy
	# test si la balle touche le mur et inverse aléat. son déplacement
	if x>385:						# mur droit.
		dx = -dx					# on inverse le déplacement.
		dy = angle[randrange(8)]	# on change l'"angle" de déplacement.
	if y>385:						# mur du dessous.
		dy = -dy
		dx = angle[randrange(8)]
	if x<15:						# mur gauche.
		dx = -dx
		dy = angle[randrange(8)]
	if y<15:						# mur du haut.
		dy = -dy
		dx = angle[randrange(8)]
	if (x>385) and (y>385):		# coin en bas à droite.
		dx, dy = -20, -10			# on change l'"angle" de déplacement.
	if (x>385) and (y<15):			# coin en haut à gauche.
		dx, dy = -20, 10
	if (x<15) and (y>385):			# coin en bas à gauche.
		dx, dy = 20, -10
	if (x<15) and (y<15):			# coin en haut à gauche.
		dx, dy = 20, 10
	# on repositionne la balle:
	can.coords(balle, x-10, y-10, x+10, y+10)
	# on trace un bout de trajectoire:
	can.create_line(xp, yp, x, y, fill="light grey")
	# ... et on remet ça jusqu'à plus soif :
	if flag > 0:
		fen.after(50,move)
		
def start():
	" Démarre l'animation."
	global flag
	flag = flag +1
	if flag == 1:
		move()
		
def stop():
	" Stop l'animation."
	global flag
	flag = 0
###############################################################################
# Corps principal du programme:
# initialisation des coordonnées, de la vitesses et du témoin d'animation :
x, y, dx, dy, flag = 15, 15, 6, 5, 0
angle = [-5,-10,-15,20,5,10,15,20]		# sert à inverser le déplacement.

fen = Tk()
fen.title("balle qui rebondit")

can = Canvas(fen, width=400, height=400, bg="white")
can.pack()

balle = can.create_oval(x-10, y-10, x+10, y+10, fill="red")

Button(fen, text="start", command=start).pack(side=LEFT, padx=10)
Button(fen, text="stop", command=stop).pack(side=RIGHT, padx=10)
Button(fen, text='Quitter', command =fen.quit).pack(side =RIGHT, padx =10)

fen.mainloop()

Dernière modification par brital (Le 02/03/2013, à 23:22)

Hors ligne

#2 Le 17/01/2013, à 07:04

pingouinux

Re : [Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Bonjour,

brital a écrit :

je ne sais pas comment faire pour changer la vitesse de la balle

Tu peux modifier cette ligne (50 millisecondes avant le déplacement suivant)

                fen.after(50,move)

ou les valeurs de dx, dy dans celle-ci

x, y, dx, dy, flag = 15, 15, 6, 5, 0

Remarques :

  • Il serait plus commode que les boutons start et stop soient contigus, ou même qu'il n'y ait qu'un seul bouton pour les deux

  • Utiliser des variables pour stocker les valeurs numériques (taille de la fenêtre, rayon de la balle, largeur du bord…)
    Cela permet de les modifier plus facilement, ou même de les fournir en arguments du script

  • On peut remplacer

    	flag = flag +1
    	if flag == 1:
    		move()

    par

    	flag = 1
    	move()

    car le test est toujours vrai

Hors ligne

#3 Le 17/01/2013, à 10:38

elendil

Re : [Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Salut,

Moi j'ai eu deux soucis avec ton code :

  • Problème d'encodage avec des caractères accentués dans les commentaires
    Solution : Soit tu supprimes toutes les lettres accentuées soit tu ajoutes la ligne suivant au tout début de ton fichier (remplace utf-8 par l'encodage que tu utilise) :

    #-*-conding: utf-8 -*-
  • Problème d'importation de Tkinter :
    En effet dans la documentation il est dit d'importer Tkinter de cette manière :

    from Tkinter import *

    Tu noteras la majuscule à Tkinter sans cette majuscule impossible de faire tourner ton code chez moi.
    (Python 2.7.3 et Tkinter $Revision: 81008 $)

Une autre amélioration serait d'ajouter la ligne suivante en première ligne de ton fichier :

#!/usr/bin/env pyhton

Ça indique au système que le script est un code python et /usr/bin/env va choisir la version de python à exécuter (en général la plus récente).

Elendil

Dernière modification par elendil (Le 17/01/2013, à 12:03)

Hors ligne

#4 Le 17/01/2013, à 10:43

pingouinux

Re : [Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Bonjour elendil,
En python3, c'est bien tkinter.

Hors ligne

#5 Le 17/01/2013, à 12:02

elendil

Re : [Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Salut,
Je note ça dans un coin pour le jour où je passerai en python3.
C'est bon à savoir pour lui aussi. Surtout s'il doit partager son code.
(Et en relisant son premier post je constate qu'il parle bien de python3...)

Dernière modification par elendil (Le 17/01/2013, à 12:03)

Hors ligne

#6 Le 28/01/2013, à 16:06

brital

Re : [Résolu]Tkinter balle qui rebondie, varier la vitesse de la balle.

Oui je suis bien en python 3 smile

Merci pour vos réponses.

Hors ligne

Haut de page ↑