1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
from tkinter import *
from random import *
from math import *
class Ball:
def __init__(self, x, y, dx, dy, E):
self.iid = canvas.create_oval(
x, y, x + 15, y + 15,
fill='red',
)
self.x = x
self.y = y
self.dx = dx
self.dy = dy
self.E=E
def move(self):
global color,NC
canvas.move(self.iid, self.dx, self.dy)
#alimenter régulièremment la particule
a=0.002
self.E=min(self.E+a,NC-1)
# si collision avec les bords, rebond élastique.
p=0.15
self.x += self.dx
if not(20 < self.x < 470):
self.dx = -self.dx
self.E=max(self.E-p,0)
self.y += self.dy
if not(20 < self.y < 310):
self.dy = -self.dy
self.E=max(self.E-p,0)
canvas.itemconfigure(self.iid, fill = color[int(self.E)])
#Couleur des balles
color=['azure','alice blue','lavender','yellow' ,'gold','gold2','gold3','goldenrod','deep sky blue','dodger blue','cornflower blue', 'blue','cadet blue','spring green','green','green2','green3','green4','peru', 'chocolate',
'orange', 'violet', 'HotPink1', 'HotPink2', 'HotPink3', 'HotPink4', 'purple', 'red', 'firebrick1', 'firebrick2', 'firebrick3', 'firebrick4', 'violet red', 'medium violet red', 'maroon', 'maroon1', 'maroon2', 'maroon3',
'maroon4', 'magenta4', 'VioletRed4', 'plum4', 'orchid4', 'MediumOrchid4','DarkOrchid4' , 'purple4']
NC=len(color)
balls = []
def move_balls(delay=20):
if balls: # s'il reste des Ball...
for b in balls:
b.move()
col_balls()
root.after(delay, move_balls)
# fonction gérant les collisions entre les particules
def col_balls():
global NC
r=0.001
for i in balls:
for j in balls:
d=sqrt((i.x-j.x)**2+(i.y-j.y)**2)
if d>0 and d<10:
i.dx=-i.dx
i.dy=-i.dy
j.dx=-j.dx
j.dy=-j.dy
S=copysign(1,i.E-j.E)
i.E=min(max(i.E+S*(r/d),0),NC-1)
j.E=min(max(j.E-S*(r/d),0),NC-1)
def demarrer():
count = int(entree.get())
canvas.delete(ALL)
balls[:] = [] # on vide la liste.
for _ in range(count):
balls.append(Ball(randint(30,420),randint(30,250), randint(1,4), randint(1,4),0))
move_balls()
if __name__ == '__main__':
root = Tk()
canvas = Canvas(root,width = 480, height = 320 , bd=0, bg="white")
canvas.pack()
Button(root,text="Démarrer",command=demarrer).pack(side=LEFT)
Button(root, text ='Quitter', command = root.destroy).pack(side=RIGHT)
entree = Entry(root,width=3)
entree.pack()
root.mainloop() |
Partager