Bonjour

J'avais besoin d'un chronomètre et j'ai récupéré ce petit prog sur le net qui fonctionne très bien:

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
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import time 
from tkinter import *
 
def lancer_chrono():
    global depart,flag
    flag=1
    depart = time.time()
    top_horloge()
 
def stoper_chrono():
    global flag
    flag=0
 
def reset_chrono():
    global depart
    depart = time.time()
 
def top_horloge():
    global depart,flag
    y=time.time()-depart    
    minutes = time.localtime(y)[4]
    secondes = time.localtime(y)[5]
    if flag :
        message.configure(text = "%i min %i sec " %(minutes,secondes))
    fenetre.after(1000,top_horloge)
 
 
if __name__=="__main__":
    flag=0
    depart = 0
    fenetre=Tk()
    fenetre.title('Chronomètre')
    message = Label(fenetre,font=('sans', 20, 'bold'),text="Chrono prêt")
    message.grid(row=1)
    Button(fenetre,text='GO !',command=lancer_chrono).grid(row=2)
    Button(fenetre,text='STOP !',command=stoper_chrono).grid(row=3)
    Button(fenetre,text='RESET',command=reset_chrono).grid(row=4)
    fenetre.mainloop()

J'ai souhaité l'intégrer à mon application en le muant en une classe pour pouvoir en tirer un unique objet en faisant ceci:

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
class Horloge(object):
    """ CLASSE qui crée une fenêtre supportant un compteur """
    flag =0
    depart =0
    def __init__(self):
        self.fenetre =Tk()
        self.fenetre.config(bd =3, pady=5, padx=5)
        self.fenetre.title('Chronomètre')
        self.message =Label(self.fenetre,font=('sans', 20, 'bold'),text="Chrono prêt")
        self.message.grid()
        self.fenetre.mainloop()        
 
    def lancer_chrono(self):
        global depart,flag
        flag=1
        depart = time.time()
        self.top_horloge()
 
    def stoper_chrono(self):
        global flag
        flag=0
 
    def reset_chrono(self):
        global depart
        depart = time.time()
 
    def top_horloge(self):
        global depart,flag
        y=time.time()-depart    
        minutes = time.localtime(y)[4]
        secondes = time.localtime(y)[5]
        if flag :
            self.message.configure(text = "{0} min {1} sec ".format(minutes,secondes))
        self.fenetre.after(1000,self.top_horloge)


Mais python me retourne une erreur que je ne parviens pas à interpréter car tout ce que j'ai fait, ça n'est que finalement
transformer des fonctions en méthodes.

Voici le message d'erreur ainsi obtenu:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
   self.message.configure(text = "{0} min {1} sec ".format(minutes,secondes))
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 1639, in configure
    return self._configure('configure', cnf, kw)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 1629, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: invalid command name ".!label"

L'utilisation du self semble poser problème.
Qu'en pensez-vous ? Merci.