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

Tkinter Python Discussion :

Déclarer plusieurs Toplevel dans __init__


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Déclarer plusieurs Toplevel dans __init__
    Au départ de l’écriture du programme, j’ai créé une classe GAM(Tk) qui déclarait uniquement les boutons, curseurs, les moyens d’accès aux fonctions. À chaque fonction, il y a la déclaration d’une fenêtre. En suivant le conseil de mon éditeur, cette déclaration va être placée dans le « __init__ »de la classe (Tk)…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ccc = Toplevel(self)
    self.ccc.withdraw()

    Puis, dans la fonction…

    la question est de savoir si il y a un moyen « PEP » pour rassembler plusieurs Toplevel ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par toumic Voir le message
    Au départ de l’écriture du programme, j’ai créé une classe GAM(Tk) qui déclarait uniquement les boutons, curseurs, les moyens d’accès aux fonctions. À chaque fonction, il y a la déclaration d’une fenêtre. En suivant le conseil de mon éditeur, cette déclaration va être placée dans le « __init__ »de la classe (Tk)…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.ccc = Toplevel(self)
    self.ccc.withdraw()

    Puis, dans la fonction…

    la question est de savoir si il y a un moyen « PEP » pour rassembler plusieurs Toplevel ?
    La Toplevel avec .deiconify() ne fonctionne qu'une seule fois. Car à sa prochaine ouverture, il y aura ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\python.exe C:/pyprogam/progamv5encore.py
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__
        return self.func(*args)
      File "C:/pyprogam/progamv5encore.py", line 515, in tetra
        self.ttt.deiconify()
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1662, in wm_deiconify
        return self.tk.call('wm', 'deiconify', self._w)
    _tkinter.TclError: bad window path name ".22242416"
     
    Process finished with exit code 0
    Alors pour ne pas rester sur une défaite, j'ai mis à la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.ccc = Toplevel(self)
    Et l'erreur disparaît, c'est quant même bizarre de déclarer une Toplevel 2 fois ?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Salut,

    Le message d'erreur _tkinter.TclError: bad window path name ".22242416" signifie que vous avez directement ou pas effectué un .destroy du widget.
    Pour vous en convaincre, vous lancez la console Python et vous regardez ce qu'il se passe lorsque vous effectuez les ces mêmes opérations hors de votre application.

    Citation Envoyé par toumic Voir le message
    la question est de savoir si il y a un moyen « PEP » pour rassembler plusieurs Toplevel ?
    Une liste ou un dictionnaire devraient suffire. Tout dépend de l'usage que vous en faites après.

    - W

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Le message d'erreur _tkinter.TclError: bad window path name ".22242416" signifie que vous avez directement ou pas effectué un .destroy du widget.
    Pour vous en convaincre, vous lancez la console Python et vous regardez ce qu'il se passe lorsque vous effectuez les ces mêmes opérations hors de votre application.



    Une liste ou un dictionnaire devraient suffire. Tout dépend de l'usage que vous en faites après.

    - W
    Oui . Je poursuis, car le problème du manque de destruction ne fait qu'entasser les fenêtres développées. Celles mêmes qui servent à garder ce fenêtrage, tout en ayant demandé un nouveau fenêtrage. Mais ce n'est pas utile, alors il faut bien détruire et rappeler.

    J'aurais préféré une réponse adaptée au moyen Toplevel pour s'actualiser, et je ne connais pas vraiment ses abysses. Comme tel cas, on fait le pont)

    Dans le fil du contournement du problème en continuité des déclarations "__init__"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Bouton tables commatiques
            self.ccc = Toplevel(self)
            self.ccc.withdraw()
            self.prescom = [0]
            self.btcom = Button(self.cad, text='Commatisme', width=15, bg='ivory', command=self.comma)
            self.btcom.pack()
    Puis dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # Section com
        def comma(self):
            if self.prescom[0] == 1:
                self.ccc.destroy()
                self.prescom[0] = 0
                self.btcom.invoke()
            else:
                self.prescom[0] = 1
                self.ccc = Toplevel(self)
                self.ccc.title('Entité Gammique : Commatisme')
                self.ccc.geometry('600x666+300+50')
    Et encore un merci à mon éditeur qui m'a montré comment peaufiner le code, quel pas éclairé limpide en termes inutiles ou déclarations mal placées. C'est bien un travail agréable quand tout se passe en accord. Même s'il reste 2 ou 3 choses à corriger, il en est meilleur
    http://cabviva.com/programs/progamv5encore.txt

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Salut,

    Relisez votre code! La Toplevel crée dans __init__ est masquée (.withdraw) et comme "self.prescom = [0]", elle ne sera jamais détruite lorsque self.comma sera appelé.
    Dans self.comma, c'est avec beaucoup de complications que vous détruisez la fenêtre lorsqu'elle existe pour appeler self.comma (via .invoke) qui a ce moment crée la fenêtre...

    Plus simple serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Bouton tables commatiques
            self.ccc = None
            self.btcom = Button(self.cad, text='Commatisme', width=15, bg='ivory', command=self.comma)
            self.btcom.pack()
    Section com
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def comma(self):
            if self.ccc is not None:
               self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.title('Entité Gammique : Commatisme')

    - W

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Relisez votre code! La Toplevel crée dans __init__ est masquée (.withdraw) et comme "self.prescom = [0]", elle ne sera jamais détruite lorsque self.comma sera appelé.
    Dans self.comma, c'est avec beaucoup de complications que vous détruisez la fenêtre lorsqu'elle existe pour appeler self.comma (via .invoke) qui a ce moment crée la fenêtre...

    Plus simple serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Bouton tables commatiques
            self.ccc = None
            self.btcom = Button(self.cad, text='Commatisme', width=15, bg='ivory', command=self.comma)
            self.btcom.pack()
    Section com
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        def comma(self):
            if self.ccc is not None:
               self.ccc.destroy()
            self.ccc = Toplevel(self)
            self.ccc.title('Entité Gammique : Commatisme')

    - W
    Je détruisais le fenêtrage ouvert lors d'une demande de réouverture, pour éviter le cumul des fenêtrages dans le cas ou celui-ci serait utile à la conservation des données précédentes. Et, ce n'est pas le cas et je crois qu'avant d'entamer la programmation du code commatique (lorsque celui-ci sera mieux compris), je vais reproduire cette image de code qui exprime une méthode nouvelle dans l'application (aide mémoire en même temps)
    Puis la déclaration dans "__init__" se fait sur un support variable et non sur Toplevel, çà je ne le savais pas !

    Merci wiztricks
    Dernière modification par Invité ; 27/03/2016 à 13h24. Motif: J'ai compris autre chose

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XHTML] comment déclarer plusieurs doctypes dans une même page
    Par elsapascal dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 21/06/2008, 11h20
  2. Comment gérer plusieurs icones dans son exécutable ?
    Par declencher dans le forum Langage
    Réponses: 5
    Dernier message: 15/10/2003, 10h49
  3. 1 SOLUTION : plusieurs anim dans un fichier x
    Par heidi79 dans le forum DirectX
    Réponses: 1
    Dernier message: 28/08/2003, 09h19
  4. Plusieurs animations dans un fichier .X
    Par heidi79 dans le forum DirectX
    Réponses: 6
    Dernier message: 25/08/2003, 02h26
  5. Réponses: 23
    Dernier message: 16/11/2002, 19h41

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