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
| 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
def trouver_angle(event):
dx = can1.canvasx(event.x) - center[0]
dy = can1.canvasy(event.y) - center[1]
try: #Si une erreur est rencontrée, on cesse d'interpréter le code et on passe aux except , qui permettent d'agir en fonction de l'erreur qui s'est produite.
return complex(dx, dy) / abs(complex(dx, dy)) #abs : Valeur absolue
except ZeroDivisionError: #Empêche l'erreur de la division par zéro et renvoie 0 à la place.
return 0.0
def press(event):
# Calcul de l'angle à partir de start
global start
start = trouver_angle(event)
def chaqueobjet (objet, coordonnées):
global angle
décalage = complex(center[0], center[1])
newxy = []
for x, y in coordonnées: #Dans les coordonnées du polygone
v = angle * (complex(x, y) - décalage) + décalage
newxy.append(v.real)
newxy.append(v.imag)
can1.coords(objet, *newxy) #Change les coordonnées, *: unpack
def mouvement(event):
# Calcul de l'angle actuel par rapport à l'angle initial
global start
global angle
angle = trouver_angle(event) / start
chaqueobjet(carré1, ccarré1)
chaqueobjet(trait1, ctrait1)
chaqueobjet(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')
can1.bind("<Button-1>", press) #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