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 :

Fermer une fenêtre ?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut Fermer une fenêtre ?
    Bonjour à tous !!

    Je suis un peu embêté actuellement, je dois réaliser un programme de calcul avec une belle interface graphique aisée à maintenir, et en tant que débutant python j'ai opté pour le tant loué Tkinter.

    Cependant, big souci ! Ca tourne avec ce que j'appelerai un multi-fenêtrage composé d'un root (mon menu principal) et d'une succession de fenetres top level, que je cache, crée et décache quand besoin est... cependant j'aurais aussi besoin de les détruire. Et c'est là que le bat blesse, je n'y arrive pas :O

    J'ai bien sur tenté la fameuse commande destroy(), dans la déclaration d'u n bouton dans la class de la page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monbouton=button(self, text='mon bouton', command=self.destroy())
    , mais aussi en remplaçant ce destroy par un quit,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monbouton=button(self, text='mon bouton', command=self.quit())
    et en applicant le destroy après la fin du mainloop, dans le main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fen1=root.Tk()
    ...
    fen1.mainloop()
    fen1.destroy()
    Et toujours le même souci : ça me supprime absolument tout les widgets, et la fenêtre reste vide. (like that : fenêtre vide"

    Vu que je dois faire un truc ergonomique c'est pas pratique du tout, le moindre retour en arrière causant suppression de la page en cours rend le tout très moche.... auriez-vous une solution svp ^^ ? Pour info (et pour des raisons de compatibilité) je tourne avec python 7.0 sur un environnement windows xp, si ça peut servir ^^



    [EDIT]

    J'ai installé python 2.7.0 bien sur...


    Merci d'avance !

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Petit rappel donc.

    destroy détruit un Widget
    quit arrête le gestionnaire d'évènement (comprendre mainloop)
    Un Toplevel dépend de son parent. Soit celui qui lui est donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Toplevel(BaseWidget, Wm):
        """Toplevel widget, e.g. for dialogs."""
        def __init__(self, master=None, cnf={}, **kw):
    Soit le _default_root
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class BaseWidget(Misc):
        """Internal class."""
        def _setup(self, master, cnf):
            """Internal function. Sets up information about children."""
            if _support_default_root:
                global _default_root
                if not master:
                    if not _default_root:
                        _default_root = Tk()
                    master = _default_root
            self.master = master
    Le gestionnaire d'événement d'un Toplevel est donc celui du master et pour le 'détruire' on utilise destroy et non quit.

    Si des Widgets persistent c'est qu'ils n'ont pas les même root.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not _default_root:
                        _default_root = Tk()
    C'est la même question que se pose PhotoImage lorsqu'il ne trouve pas l'image : 'Qui est papa ?' d'ou mon questionnement sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fen1=root.Tk()
    ...
    fen1.mainloop()
    fen1.destroy()
    fen1=root.Tk(). C'est quoi root ? L'instance Tk() ? Et fen1 est ce que vous appelez un Toplevel ?
    Il ne dois y avoir qu'une instance Tk(), Pour le reste utilisez le Widget Toplevel.

    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    root = Tk.Tk()
    root.title('root')
     
    fen1=Tk.Toplevel(root)
    fen1.title('Toplevel')
     
    Tk.Button(root, text='détruire le Toplevel', command=fen1.destroy).pack()
    Tk.Button(root, text='Quit', command=root.quit).pack()
    root.mainloop()
    @+

    Variation sur le sujet pour vous permettre d'aller plus loin:
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    class montoplevel(Tk.Toplevel):
        def __init__(self, parent, txt):
            Tk.Toplevel.__init__(self, parent)
            self.parent = parent
            Tk.Label(self, text=txt).pack()
     
        def Quit(self):
            self.destroy()
     
    class appli(Tk.Tk):
        def __init__(self, parent):
            Tk.Tk.__init__(self, parent)
            self.parent = parent
            self.protocol("WM_DELETE_WINDOW", self.Intercepte)
            self.tplist = []
            for i in range(10):
                self.tplist.append(montoplevel(self, 'Toplevel '+str(i)))
                Tk.Button(self, text='Détruire '+str(i), command=self.tplist[i].Quit).pack()
     
        def Intercepte(self):
            #for elem in self.tplist:
            #    elem.destroy()
            for widget in self.winfo_children():
                if isinstance(widget, Tk.Toplevel):
                    widget.destroy()
            self.quit()
     
    if __name__ == "__main__":
        app = appli(None)
        app.title('Test Tkinter')
        app.mainloop()
    Edit : Rajout du self.parent = parent. Inutile dans l'exemple mais complète le sujet.

  3. #3
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut
    Bonjour,

    Merci pour ces infos ! J'utilisais bien un widget toplevel pour créer les nouvelles fenêtres, par contre je m'aperçois que j'ai un peu tout mélangé.

    Je n'ai pas le code chez moi (d'où mes bouts de codes approximatif), je m'occuperai de ça lundi, je repasserai si jamais j'ai une autre question !

    En tout cas merci beaucoup de cette réponse très précise !

  4. #4
    Membre averti
    Inscrit en
    Mai 2011
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 21
    Par défaut
    Merci beaucoup pour ces informations ! En fait le code exemple que j'avais trouvé faisait un mélange entre tk et frame, et n'était vraiment pas génial !!

    J'ai réussi à tout épurer en tout cas, merci bcp !!

  5. #5
    Membre averti
    Femme Profil pro
    étudiante
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Par défaut
    Bonjour
    porquoi on ne peut pas utiliser destroy pour le root ? car à chaque fois j'ai mis command=root.quit l'exécution se bloque mais quand je l'ai modifiée en root.destroy, elle marche.
    merci d'avance

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    C'est que 'l'outil' que vous utilisez pour programmer est en Tk.

    Rajoutez ceci si vous voulez

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       app.mainloop()
       app.destroy()
    @+

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

Discussions similaires

  1. Comment fermer une fenêtre enfant MDI ?
    Par DeveloMagaly dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2005, 13h10
  2. [Delphi 6] Empêcher l'ouverture ou fermer une fenêtre
    Par KrusK dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 08/09/2005, 11h55
  3. Fermer une fenêtre depuis une autre...
    Par nicolb dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/03/2005, 10h22
  4. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09
  5. Fermer une fenêtre au bout d'un certain temps.
    Par cprogil dans le forum Composants VCL
    Réponses: 5
    Dernier message: 27/11/2003, 18h25

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