Bonjour, je dois créer un jeu et je suis bloqué à plusieurs endroits.

Le but du jeu est d'aligner des arcs de trois disques concentriques. Lorsque je tourne le disque le plus petit, le 2ème disque doit tourner dans le sens inverse et le 3ème disque dans le bon sens.
Lorsque je tourne le 2ème disque, le disque 1 reste stable et le 3ème disque tourne dans le sens inverse. Et au final lorsque je tourne le 3ème disque, les deux autres sont stables.
J'ai trouvé pour effectuer des rotations la méthode des complexes sur http://effbot.org/zone/tkinter-complex-canvas.htm et je l'ai adapté pour pouvoir l'utiliser sur plusieurs objets.

Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()
Tout d'abord, j'aimerais si possible utiliser une seule fois la fonction chaqueobjet avec les tags, ce qui serait plus simple vu qu'à la fin il y aura plein d'objets, sauf que j'ai besoin des coordonnées de chaque objet pour pouvoir l'utiliser.
Sinon, il y a toujours la méthode find_overlapping mais je ne vois pas comment l'utiliser dans un cercle, et encore plus difficilement entre deux cercles.

Ensuite je veux donc inverser le rotation de D2 par rapport à D1 : quand D1 tourne, D2 soit tourner dans l'autre sens.
Enfait, les disques ne sont pas tagués car la rotation ne marchent pas avec les disques, mais ils n'ont pas besoin de tourner puisqu'ils sont centrés.
Ce sont donc tous les objets compris dans ces disques qui doivent effectuer la rotation.

Sur le code, les objets compris dans D1 tournent bien autour du centre, mais je ne sais pas comment faire tourner ceux dans D2 dans l'autre sens.

Voilà j'espère avoir été clair

Merci d'avance!