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 :

Comment naviguer de classe en classe


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Comment naviguer de classe en classe
    Bonsoir,

    Je trouve dans votre forum de nombreux éléments de savoir-faire et je vous en remercie. Voici ma question :

    Sans utiliser de classes, à partir d'une fenêtre menu je sais lancer diverses activités totalement indépendantes et revenir à la fenêtre menu. Je cherche à faire la même chose mais en utilisant des classes. mais là je ne sais pas. Dans le code ci-dessous, je détruis la fenêtre menu et bien évidemment, je ne peux y revenir.

    Merci de m'indiquer des modifications pour y parvenir

    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
    #! /usr/bin/env PYTHON
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Menu:
     
        def __init__ (self, parent):
     
            global NbreCre
            global SomRepart
     
            self.parent = root
            self.Bouton1 = Button (text = "Activité 1",bg="white",command=self.clickBouton1).place(width=300,height=30,relx=0.25,rely=0.2)
     
            self.Bouton2 = Button (text = "Activité 2",bg="white",command=self.clickBouton2).place(width=300,height=30,relx=0.25,rely=0.4)
     
        def clickBouton1(self):
                root.destroy()
                fen1 = Fen1(Toplevel)
     
        def clickBouton2(self):
                root.destroy()
                fen2 = Fen2(Toplevel)
     
    class Fen1:
     
        def __init__ (self, parent):
     
     
     
            fen1 = Tk()
            fen1.title("Activité 1")
            fen1.geometry("600x400")
     
     
            self.message = Label(text = "Ici se trouverait le code de l'activité 1 mais comment retourner au menu ?",bg="white").place(width=500,height=30,relx=0.10,rely=0.2)
     
    class Fen2:
     
        def __init__ (self, parent):
     
     
            fen2 = Tk()
            fen2.title("Activité 2")
            fen2.geometry("600x400")
     
            self.message = Label(text = "Ici se trouverait le code de l'activité 1 mais comment retourner au menu ?",bg="white").place(width=500,height=30,relx=0.10,rely=0.2)
     
     
    root = Tk() 
    myapp = Menu(root)
    root.title ("Diverses Activités")        
    root.geometry("600x400")
    root.mainloop()
    .

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Pour pouvoir jongler avec différentes fenêtres, il serait plus simple de définir une classe principale qui jouera le rôle de dispatching.

    Ta classe principale instancie chaque fenêtre en lui transmettant sa propre référence, les actions de sortie des fenêtres secondaires peuvent ainsi être redirigées vers cette classe principale qui fermera proprement la fenêtre secondaire.

    Si ce que tu appelles Menu est en fait la fenêtre principale alors appelle-la Main ou n'importe, mais pas Menu puisque ce n'en est pas un et surtout ne la détruit pas lorsque tu crées une nouvelle fenêtre.

    root semble être l'élément de base de ton application, root.mainloop(), or dans chaque action bouton tu commences par le détruire, pas logique ça.

    Quelques remarques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Menu:
        def __init__ (self, parent):
     
            global NbreCre
            global SomRepart
     
            self.parent = root
    Si tu travailles avec des classes, oublie définitivement (sans un seul regard en arrière) les global.
    Tu passes root en argument mais tu fais self.parent = root, soyons plus cohérent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        def __init__ (self, parent):
            self.parent = parent
    Plus loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            self.Bouton1 = Button (...).place(width=300,height=30,relx=0.25,rely=0.2)
    self.Bouton1 n'est pas référence de Button() mais du retour de Button.place(), à vérifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            self.Bouton1 = Button (text = "Activité 1",bg="white",command=self.clickBouton1).place(width=300,height=30,relx=0.25,rely=0.2)
            print self.Bouton1
    Je pense que tu ne devrais avoir qu'une seule instance de Tk() dans ton code et créer tes boîtes de dialogue à partir de là.

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Août 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 28
    Par défaut Version corrigée
    Merci de votre réponse rapide et bien documentée qui m'a permis de parvenir à mes fins.
    En fait je n'ai plus qu'une seule classe et une seule fenêtre que je nettoie.

    Pour ceux que cela pourrait aider, je joins le code corrigé.


    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
    #! /usr/bin/env PYTHON
    # -*- coding: utf-8 -*-
     
    from tkinter import *
     
    class Main:
     
        def __init__ (self):
     
            self.parent = root
            self.accueil()
     
     
        def accueil(self):
     
            Button (self.parent,text = "Activité 1",bg="white",command=self.clickBouton1).place(width=300,height=30,relx=0.25,rely=0.2)
     
            Button (self.parent,text = "Activité 2",bg="white",command=self.clickBouton2).place(width=300,height=30,relx=0.25,rely=0.4)
     
        def clickBouton1(self):
                self.nettoyage()
                self.activite1()
     
     
        def clickBouton2(self):
                self.nettoyage()
                self.activite2()
     
        def nettoyage(self):
     
                for w in self.parent.winfo_children():
                    w.destroy()
                self.parent.pack_propagate(0)      #si tu veux que la fenetre ne se redimentionne pas
     
        def retour(self):
     
                self.nettoyage()
                self.accueil() 
     
     
        def activite1(self):
     
                Label(self.parent,text="Ici se déroulerait l'activité 1", bg="lightyellow").place(width=300,height=30,relx=0.25,rely=0.2)
     
                Button(self.parent,text="Retour à l'accueil",command=self.retour, bg="lightyellow").place(width=300,height=30,relx=0.25,rely=0.4)
     
        def activite2(self):
     
                Label(self.parent,text="Ici se déroulerait l'activité 2", bg="lightyellow").place(width=300,height=30,relx=0.25,rely=0.2)
     
                Button(self.parent,text="Retour à l'accueil",command=self.retour, bg="lightyellow").place(width=300,height=30,relx=0.25,rely=0.4)
     
     
    root = Tk() 
    myapp = Main()
    root.title ("Diverses Activités")        
    root.geometry("600x400")
    root.mainloop()

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/03/2006, 18h24
  2. Réponses: 2
    Dernier message: 24/02/2006, 10h36
  3. Réponses: 1
    Dernier message: 09/02/2006, 16h59
  4. Réponses: 14
    Dernier message: 02/02/2006, 18h32
  5. ClassWizard --> comment lui faire reconnaitre mes classes
    Par bigboomshakala dans le forum MFC
    Réponses: 6
    Dernier message: 06/05/2004, 10h50

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