IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GUI Python Discussion :

erreur dans tkinter


Sujet :

GUI Python

  1. #1
    Invité
    Invité(e)
    Par défaut erreur dans tkinter
    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.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 586
    Par défaut
    Salut,

    Citation Envoyé par ceststef Voir le message
    L'utilisation du self semble poser problème.
    Qu'en pensez-vous ? Merci.
    La seule chose qu'on peut dire c'est que le Label a été détruit lorsqu'on essaie d'y accéder. Reste à avoir le code "complet" pour savoir comment....

    Pour le reste, ouvrez un tuto et apprenez à utiliser les classes: c'est un peu plus compliqué que ce que vous avez essayé.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    Au cours de l'exécution de mon programme, voilà comment j'ai ensuite instancié un objet et ensuite appelé la méthode lancer_chrono() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    horl =Horloge()
    horl.lancer_chrono()
    S'agissant du code complet, il fait 22603 lignes.

    Si je ne remets pas en cause l'idée qu'utiliser des classes ne soit pas chose aisée, ne vous en déplaise, je ne retiens qu'un intérêt modéré à votre réponse car je ne vous ai pas attendu pour ouvrir un tuto, comme vous dîtes.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 586
    Par défaut
    Salut,

    Si vous exécutez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    horl =Horloge()
    horl.lancer_chrono()
    vous constateriez que la première ligne horl = Horloge() ne se termine jamais (à cause de l'appel à mainloop dans le __init__). De ce fait, on ne peut pas exécuter la deuxième ligne et reproduire quoi que ce soit.

    Citation Envoyé par ceststef
    S'agissant du code complet, il fait 22603 lignes.
    Inutile de poster le code complet pour reproduire un problème... Et pour l'instant, on ne sait toujours pas comment le faire.

    Citation Envoyé par ceststef
    Si je ne remets pas en cause l'idée qu'utiliser des classes ne soit pas chose aisée, ne vous en déplaise, je ne retiens qu'un intérêt modéré à votre réponse car je ne vous ai pas attendu pour ouvrir un tuto, comme vous dîtes.
    Ça tombe bien car je ne vais pas vous expliquer ce qui ne va pas côté "classe": il y a des tutos pour çà! Je vous dis juste que votre code montre que vous ne les maîtrisez pas encore.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut
    Cela fonctionne parfaitement.

    Effectivement, le mainloop, très logiquement, faisait obstacle à la poursuite du programme.
    Il faut être pris pour être appris.

    Merci du coup de main.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 586
    Par défaut
    Et pour les autres une mouture plus conventionnelle (qui ne fait pas 22000 lignes):
    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
    import tkinter as tk
    import time
     
    class Horloge(tk.Frame):
        ident = None
        value = '00:00'
        start_time = 0
     
        def __init__(self, master, kwds=None, **kwargs):
            font = kwargs.pop('font', ('sans', 20, 'bold'))
            super().__init__(master, kwds, **kwargs)
            self.label = tk.Label(self, font=font, text=self.value)
            self.label.pack()
     
        def start(self):
            if self.ident is None:
                self.start_time = time.time()
                self._update()
     
        def stop(self):
            if self.ident is not None:
                self.after_cancel(self.ident)
                self.ident = None
     
        def reset(self):
            if self.ident is not None:
                self.start_time = time.time()
     
        def _update(self, delay=100):
     
            elapsed = time.time() - self.start_time
            value = time.strftime('%M:%S', time.gmtime(elapsed))
            if value != self.value:
                self.value = self.label['text'] = value
            self.ident = self.after(delay, self._update)
     
    if __name__ == '__main__':
     
        root = tk.Tk()
        horloge = Horloge(root)
        horloge.pack()
        for name in ('start', 'stop', 'reset'):
            tk.Button(root, text=name, command=getattr(horloge, name)).pack()
        tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Invité
    Invité(e)
    Par défaut
    22603

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ça tombe bien car je ne vais pas vous expliquer ce qui ne va pas côté "classe"
    - W
    Salut,

    Rassurez-vous, ça n'a pas d'importance, avec le temps et de la patience, j'y parviendrai.
    Mais je vous l'ai dit, merci pour le coup de main.

  9. #9
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 909
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et pour les autres une mouture plus conventionnelle (qui ne fait pas 22000 lignes):
    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
    import tkinter as tk
    import time
     
    class Horloge(tk.Frame):
        ident = None
        value = '00:00'
        start_time = 0
     
        def __init__(self, master, kwds=None, **kwargs):
            font = kwargs.pop('font', ('sans', 20, 'bold'))
            super().__init__(master, kwds, **kwargs)
            self.label = tk.Label(self, font=font, text=self.value)
            self.label.pack()
     
        def start(self):
            if self.ident is None:
                self.start_time = time.time()
                self._update()
     
        def stop(self):
            if self.ident is not None:
                self.after_cancel(self.ident)
                self.ident = None
     
        def reset(self):
            if self.ident is not None:
                self.start_time = time.time()
     
        def _update(self, delay=100):
     
            elapsed = time.time() - self.start_time
            value = time.strftime('%M:%S', time.gmtime(elapsed))
            if value != self.value:
                self.value = self.label['text'] = value
            self.ident = self.after(delay, self._update)
     
    if __name__ == '__main__':
     
        root = tk.Tk()
        horloge = Horloge(root)
        horloge.pack()
        for name in ('start', 'stop', 'reset'):
            tk.Button(root, text=name, command=getattr(horloge, name)).pack()
        tk.mainloop()
    - W
    Merci .

Discussions similaires

  1. [Tomcat] configuration d'une page d'erreur dans web.xml
    Par Super Castor dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 08/04/2009, 16h58
  2. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 09h15
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 15h59
  4. [Erreur dans la lib...]
    Par Gonath dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/12/2003, 10h02
  5. Erreur dans l'utilisation de SWAP
    Par mire dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2003, 22h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo