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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| from tkinter import *
import math
# Création du widget principal ("maître") :
fen1 = Tk()
fen1.title("Jeu")
#http://effbot.org/zone/tkinter-complex-canvas.htm
#http://www.gigante.be/python/didact_005.php
def trouver_angle(event):
dx = can1.canvasx(event.x) - center[0]
dy = can1.canvasy(event.y) - center[1]
return complex(dx, dy)/ abs(complex(dx, dy)) #on a e^i0
def tournerdisque1 (objet, coord):
global angle
décalage = complex(center[0], center[1])
newxy = []
for x, y in coord: #Dans les coordonnées du polygone
v = angle * (complex(x, y) - décalage) + décalage #z=e^i0 *(z - zc) + zc
newxy.append(v.real)
newxy.append(v.imag)
can1.coords(objet, *newxy) #Change les coordonnées, *: unpack
#return [(newxy[i], newxy[i+1]) for i in range(0,8,2)]
def tournerdisque2 (objet, coord):
global angle
décalage = complex(center[0], center[1])
newxy = []
for x, y in coord:
v = 1/angle * (complex(x, y) - décalage) + décalage
newxy.append(v.real)
newxy.append(v.imag)
can1.coords(objet, *newxy)
def tournerdisque3 (objet, coord):
global angle
décalage = complex(center[0], center[1])
newxy = []
for x, y in coord:
v = angle * (complex(x, y) - décalage) + décalage
newxy.append(v.real)
newxy.append(v.imag)
can1.coords(objet, *newxy)
def mouvement(event):
# Calcul de l'angle actuel par rapport à l'angle initial
global angle
angle = trouver_angle(event);
disque1=[(carré1,ccarré1), (trait1,ctrait1), (triangle1,ctriangle1)];
disque2=[(carré2,ccarré2), (trait2,ctrait2), (triangle2,ctriangle2)]
disque3=[(carré3,ccarré3), (trait3,ctrait3), (triangle3,ctriangle3)]
for (obj,coord) in disque1:
tournerdisque1(obj, coord);
for (obj,coord) in disque2:
tournerdisque2(obj, coord)
for (obj,coord) in disque3:
tournerdisque3(obj, coord)
## tournerdisque1(carré1, ccarré1)
## tournerdisque1(trait1, ctrait1)
## tournerdisque1(triangle1,ctriangle1)
# création des widgets "esclaves" :
can1 = Canvas(fen1, bg='dark grey', width=400, height=400)
can1.pack(side=BOTTOM)
center = 200, 200 #Donc center[0]=200
l = LabelFrame(fen1, text="Jeu", padx=20, pady=20)
l.pack(fill="both", expand="yes")
Label(l, text="Faire tourner le disque").pack(side=TOP)
#Elements :
cercle1 = can1.create_oval(50,50,350,350,width=2,outline='red')
cercle2 = can1.create_oval(150,150,250,250,width=2,outline='red')
cercle3 = can1.create_oval(100,100,300,300,width=2,outline='red')
ccarré1 = [(165, 165), (185, 165), (185, 185), (165, 185)]
carré1 = can1.create_polygon(ccarré1,tags='disque1')
ctrait1 = [(165,165), (200,200)]
trait1 = can1.create_line(ctrait1,width=2,fill='blue', tags='disque1') # Coordonnées : (x1,y1,x2,y2)
ctriangle1 = [(200, 225), (225, 200), (250, 225)]
triangle1 =can1.create_polygon(ctriangle1, fill = 'green', tags='disque1')
ccarré2 = [(135, 135), (155, 135), (155, 155), (135, 155)]
carré2 = can1.create_polygon(ccarré2,tags='disque2')
ctrait2 = [(135,135), (165,165)]
trait2 = can1.create_line(ctrait2,width=2,fill='blue', tags='disque2')
ctriangle2 = [(125, 150), (150, 125), (175, 150)]
triangle2 =can1.create_polygon(ctriangle2, fill = 'green', tags='disque2')
ccarré3 = [(265, 265), (285, 265), (285, 285), (265, 285)]
carré3 = can1.create_polygon(ccarré3,tags='disque3')
ctrait3 = [(265,265), (300,300)]
trait3 = can1.create_line(ctrait3,width=2,fill='blue', tags='disque3')
ctriangle3 = [(270, 295), (295, 270), (320, 295)]
triangle3 =can1.create_polygon(ctriangle3, fill = 'green', tags='disque3')
can1.bind("<Button-1>", trouver_angle) #click gauche
can1.bind("<B1-Motion>", mouvement) #Mouvement de la souris avec click gauche
Button(fen1,text='Quitter',command=fen1.destroy, relief=RAISED, cursor ="pirate").pack(side=BOTTOM)
# démarrage du réceptionnaire d'évènements (boucle principale) :
fen1.mainloop() |
Partager