Bonjours à tous !
Voilà, à vrai dire mon programme est plus ou moins terminé, il s'agit d'un "timer de cube", vous vous demanderez surement ce que c'est : il s'agit d'un chronomètre pour les gens comme moi qui font du speedcubing, c'est à dire qui s'amusent à résoudre le Rubik's cube le plus rapidement possible.

Mais là n'est pas la question !

Il se trouve que ce programme "plante" de manière pour moi, totalement aléatoire. Je pense que c'est du au "thread" mais je dis ça presque au pif, parce que c'est la première fois que ce genre de problème m'arrive. (et c'est aussi la première fois que j'utilise un thread)
Donc je fais appel aux programmeurs confirmés qui traînent sur ce forum pour me donner leur avis vis à vis de ce petit désagrément qui ne m'a pas empêcher de le terminer pour autant mais qui peut s'avérer gênant.

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
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
 
from random import*
from tkinter import*
from time import time,sleep
import threading
 
#Crée un mélange aléatoire de x mouvements, sans mouvements inutiles
def melange(x):
    global last_scramble
    liste = [["U","U'","U2","u","u'","u2"],["D","D'","D2","d","d'","d2"],["R","R'","R2","r","r'","r2"],["L","L'","L2","l","l'","l2"],["F","F'","F2","f","f'","f2"],["B","B'","B2","b","b'","b2"]]
    if x < 40:
        d = 3
    else :
        d = 6
    c = 20
    a = 15
    r = 0
    scramble=""
    while r<x:
        a=randrange(6)
        b=randrange(d)
        if a != c :
            if a == 0 or a == 2 or a == 4:
                if c != a+1 :
                    r=r+1
                    move=liste[a][b]
                    scramble = scramble+" "+move
                    c = a
            else:
                if c != a-1 :
                    r=r+1
                    move=liste[a][b]
                    scramble = scramble+" "+move
                    c = a
    texte.config(text=scramble)
    dernier_melange.config(text=last_scramble)
    last_scramble = "Dernier mélange : "+scramble
 
#Boucle tant que flag == 1 pour modifier la variable du temps (chrono) et ajoute le temps à liste_temps une fois la boucle terminée
def chrono():
    montemps=time()
    while flag == 1:
        y="%.3f" % (time()- montemps)
        nombre.set(y)
    liste_temps.append(y)
    listeur()
 
#Crée une variable d'affichage à partir de la liste des temps et calcule l'ao totale
def listeur():
    global liste
    liste = ""
    for n in range(len(liste_temps)):
        liste = liste+str(liste_temps[n])+" "
    temps.delete('0.0','end')
    temps.insert(0.0,liste)
 
    #Calcul de temps sans DNF
    laine = len(liste_temps)
    for n in range (len(liste_temps)):
        if liste_temps[n] == "DNF":
            laine = laine-1
    #ao totale, autres best ao, pire et meilleur
    ao_totale_texte = "0.000"
    if laine>0:
        ao_totale_texte = 0
        ao_totale_texte = float(averageur(len(liste_temps)))
        ao_totale.configure(text="ao "+str(len(liste_temps))+" : "+"%.3f" % ao_totale_texte)
 
        #Meilleur et pire temps
        meilleur,pire = extremum(0,len(liste_temps))
        best.configure(text="best : "+str(meilleur))
        worst.configure(text="worst : "+str(pire))
 
        #best ao 5, 12 et 100
        if laine>4:
            ao_5.configure(text="best ao 5 : "+str(averageur(5)))
        else : ao_5.configure(text="best ao 5 : 0.000")
        if laine>11:
            ao_12.configure(text="best ao 12 : "+str(averageur(12)))
        else : ao_12.configure(text="best ao 12 : 0.000")
        if laine>99:
            ao_100.configure(text="best ao 100 : "+str(averageur(100)))
        else : ao_100.configure(text="best ao 100 : 0.000")
    else:#réinitialisation si aucun temps (suite à une suppression ou DNF)
        ao_totale.configure(text="ao "+str(len(liste_temps))+" : "+ao_totale_texte)
        best.configure(text="best : 0.000")
        worst.configure(text="worst : 0.000")
 
def averageur(x):
    minimum = 10000
    test = 0
    laine = len(liste_temps)
    for n in range(len(liste_temps)-(x-1)):
        meilleur,pire = extremum(n,n+x)
        elimines = meilleur+pire
        for m in range(x):
            o = n+m
            if liste_temps[o] != "DNF":
                test = test+float(liste_temps[o])
            else: laine = laine-1
        test = test-elimines
        if x > 2:
            test = (test/(x-2))
        else : test = test/x
        if test < minimum:
            minimum = test
            test = 0
    return "%.3f"%minimum
 
def extremum(a,b):
    best = 1000000
    worst = 0
    for n in range (a,b):
        test1 = float(liste_temps[n])
        test2 = float(liste_temps[n])
        if test1 < best:
            best = test1
        if test2 > worst:
            worst = test2
    return best,worst
 
def inter_on(event):
    global flag,stop
    if flag == 0 and stop == 0 and event.keysym == "space":
        t = threading.Thread(target=chrono)
        flag = 1
        t.start()
        stop = 1
    else:
        stop = 0
 
def inter_off(event):
    global flag
    if event.keysym == "F11":
        plein_ecran(1)
    elif event.keysym == "Escape":
        plein_ecran(0)
    if flag == 1:
        flag = 0
        melange(w)
 
def change(x):
    global w,liste_temps
    w = x
    melange(w)
    liste_temps = []
    listeur()
    ao_totale.configure(text="ao totale : 0.000")
    dernier_melange.configure(text="")
 
def effacer(x):
    if len(liste_temps)>0:
        liste_temps.remove(liste_temps[x])
        listeur()
 
def plus_2():
    if len(liste_temps)>0:
        liste_temps[-1] = "%.3f" % (float(liste_temps[-1])+2)
        listeur()
 
def DNF():
    if len(liste_temps)>0:
        liste_temps[-1] = "DNF"
        listeur()
 
def plein_ecran(x):
    fen.attributes("-fullscreen", x)
    if x == 1:
        fenetre.entryconfigure(0,label="Quitter le plein écran    [Echap]", command=lambda:plein_ecran(0))
    elif x == 0:
        fenetre.entryconfigure(0,label="Plein écran    [F11]", command=lambda:plein_ecran(1))
 
#Variables
flag = 0
w = 20
liste_temps = []
last_scramble=""
stop = 0
# ---------- Programme principal ----------
fen = Tk()
fen.bind("<KeyRelease>",inter_on)
fen.bind("<Key>",inter_off)
# ----- Widgets -----
texte = Label(fen,text="Veuillez patienter",font="{Tahoma} 18")
texte.pack(pady=5)
 
dernier_melange = Label(fen,text=last_scramble,font="{Tahoma} 14")
dernier_melange.pack(pady=5)
 
nombre = StringVar()
nombre.set("0.000")
temp = Label(fen,textvariable=nombre,font="{Tahoma} 200").pack()
 
stats = Frame(fen)
stats.pack()
 
frame = Frame(stats)
frame.grid(row=0,column=0,pady=10, padx=10)
 
temps = Text(frame,font="{Tahoma} 18",width=31,height=7,wrap=WORD)
temps.grid(column=0, row=0)
 
scrollbar = Scrollbar(frame,command=temps.yview)
scrollbar.grid(column=1, row=0, sticky=S+N)
 
averages = Frame(stats,borderwidth=2,relief=GROOVE)
averages.grid(row=0,column=1,padx=10,pady=5)
 
best = Label(averages,text="best : 0.000",font="{Tahoma} 18")
best.pack(padx=10)
 
worst = Label(averages,text="worst : 0.000",font="{Tahoma} 18")
worst.pack(padx=10)
 
ao_totale = Label(averages,text="ao : 0.000",font="{Tahoma} 18")
ao_totale.pack(padx=10)
 
ao_5 = Label(averages,text="best ao 5 : 0.000",font="{Tahoma} 18")
ao_5.pack(padx=10)
 
ao_12 = Label(averages,text="best ao 12 : 0.000",font="{Tahoma} 18")
ao_12.pack(padx=10)
 
ao_100 = Label(averages,text="best ao 100 : 0.000",font="{Tahoma} 18")
ao_100.pack(padx=10)
# ----- Menu -----
Cube = Menu(fen)
 
fenetre = Menu(Cube,tearoff=0)
fenetre.add_command(label="Plein écran    [F11]", command=lambda:plein_ecran(1))
fenetre.add_separator()
fenetre.add_command(label="Quitter", command=fen.destroy,)
Cube.add_cascade(label="Fenêtre", menu=fenetre)
 
Cubes = Menu(Cube, tearoff=0)
Cubes.add_command(label="2x2x2", command=lambda:change(10))
Cubes.add_command(label="3x3x3", command=lambda:change(20))
Cubes.add_command(label="4x4x4", command=lambda:change(40))
Cube.add_cascade(label="Catégorie", menu=Cubes)
 
effacage = Menu(Cube, tearoff=0)
effacage.add_command(label="Dernier temps", command=lambda:effacer(-1))
effacage.add_command(label="Premier temps", command=lambda:effacer(0))
Cube.add_cascade(label="Effacer", menu=effacage)
 
penalite = Menu(Cube, tearoff=0)
penalite.add_command(label="+2", command=plus_2)
penalite.add_command(label="DNF", command=DNF)
Cube.add_cascade(label="Pénalités", menu=penalite)
 
fen.config(menu=Cube)
 
melange(20)
fen.mainloop()
Voilà, et je dis un grand "merci !" d'avance à ceux qui essaieront de m'aider !
(je tiens à préciser que je code depuis moins d'un an, j'ai commencé septembre dernier avec l'option ISN de mon lycée, je ne suis donc pas très expérimenté ^^')
EDIT : au cas où, le thread est défini à la ligne 125 ^^