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 :

Fenêtre imbriquées les unes dans les autres


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut Fenêtre imbriquées les unes dans les autres
    Bonjour à tous,

    J'ai créée un GUI en suivant divers tutos: celle-ci est composé d'un container principal qui contient plusieurs frames et on navigue entre ses frames via des boutons.

    L'une de mes pages contient un bouton qui ouvre un topLevel. Et j'aimerais pouvoir reprendre le même systèmes qu'avec le container principale, c'est-à-dire avec plusieurs frames (ou toplevel ou autre) rattacher à ce topLevel.

    J'ai essayé de reproduire avec des frames et les frames n'apparaisse pas, je n'arrive pas à comprendre pourquoi. [ Aucun message d'erreur]

    J'ai essayé de le faire via d'autres topLevel mais ceux-ci apparaisse tous en même temps et c'est possible j'aimerais éviter d'utiliser iconifi et etc

    Voici mon code version épuré: (Si besoin de plus dite le moi, je voulais éviter de mettre un gros pâté)
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    from functools import partial
    import tkinter as tk
    from tkinter import Toplevel, Canvas
     
    def dashboard_view(self):
        """
        Permet d'afficher des toplevel contenant des graphique
        de l'analyse demmander
        """
        fram = Toplevel(self)
        fram.title("Analyse graphique")
        fram.config(background= "#005b96")
        fram.geometry("1400x800+250+100")
        fram.wm_state("zoomed")
     
        titre1 = tk.Label(fram, text='Mod')
     
     
     
     
        titre1.place(relx=0.5, rely=0.03, anchor='center')
     
     
        frame2 = tk.Frame(fram)
        frame2.config(background=  '#FFA500')
        frame2.pack(side="top", fill="both", expand = True)
        frame2.grid_rowconfigure(0, weight=1)
        frame2.grid_columnconfigure(0, weight=1)
     
     
     
    class Principal(tk.Tk):
     
        def __init__(self):
            tk.Tk.__init__(self)
     
            tk.Tk.wm_title(self, "Appli extract")
     
            container = tk.Frame(self)
            container.pack(side="top", fill="both", expand = True)
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight=1)
     
     
     
     
            self.liste_page = {}
     
            for page in (PageOne, PageTwo, PageThree):
     
                frame = page(container, self) # création de page ancré sur le contenair de classe PageOne ..
     
                self.liste_page[page] = frame # One done a la liste la page
     
                frame.grid(row=0, column=0, sticky="nsew") # on place la page
     
            self.show_frame(PageOne)# on appel la fonction page 1
     
     
        def show_frame(self, cont):
     
            frame = self.liste_page[cont]
            frame.tkraise()
     
     
     
    class PageOne(tk.Frame):
     
        def __init__(self, parent, controller):
     
            tk.Frame.__init__(self, parent)
            tk.Frame.config(self, background= '#87CEFA')
     
            titre = tk.Label(self,text='Page un') 
     
            button_graph = tk.Button(self, text='go page 3', command= partial (controller.show_frame,PageThree))
     
     
            titre.place(relx=0.5, rely=0.12, anchor='center')
            button_graph.place(relx=0.5, rely=0.5, anchor='center')
     
     
     
     
     
    class PageTwo(tk.Frame):
     
        def __init__(self, parent, controller):
     
            tk.Frame.__init__(self, parent)   
     
     
     
    class PageThree(tk.Frame):
     
        def __init__(self, parent, controller):
     
            tk.Frame.__init__(self, parent)
            tk.Frame.config(self, background= '#87CEFA')
     
            widget_boutton = Canvas(
                                     self, width=300, height=50, bg= "#005b96", 
                                     highlightbackground= "#005b96", 
                                     highlightcolor= "#005b96"
                                   )
     
            button_graph = tk.Button(widget_boutton, command=partial(dashboard_view, self))
            button_graph.config(fg='#FFA500',bg= 'black', text='Graphique')
            widget_boutton.place(relx=0.5, rely=0.55, anchor='center')#container
            button_graph.place(relx=0.5, rely=0.55, anchor='center')
     
     
    app= Principal()
    app.geometry("400x300+750+300")
    app.mainloop()
    Avez-vous des conseils ou des remarques ?

    Je vous remercie par avance de vos réponses

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par Alouqua Voir le message
    Voici mon code version épuré:
    Quitte à épurer un code... autant faire en sorte qu'on puisse l'exécuter.

    Citation Envoyé par Alouqua Voir le message
    Avez-vous des conseils ou des remarques ?
    Les "widgets" notebook et panedwindows sont déjà là pour faire ce genre de chose.
    A part çà, je dirais que pour qu'un widget s'affiche, il faut le faire explicitement via .pack, .grid ou autre (ce que vous n'avez pas besoin de faire avec Toplevel, i.e. une fenêtre).

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

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 4
    Par défaut
    Tous d'abord merci pour ta réponse, j'ai rectifié le code, car effectivement j'ai voulu aller un peu vite.

    Pour panedwindows, cela ne convient pas à ce que je veux faire, car on ne fait que séparé une frame en plusieurs morceaux alors que je veux avoir des frames bien distinct.

    Pour notebook je ne connaissais pas, je suis en train de regarder, mais la présence d'onglet me gêne quand même.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Alouqua Voir le message
    Pour notebook je ne connaissais pas, je suis en train de regarder, mais la présence d'onglet me gêne quand même.
    De toutes façons, il va falloir pouvoir naviguer entre vos "pages" et avoir un système de navigation cohérent histoire que l'utilisateur s'y retrouve.

    PanedWindow vous permet d'avoir un panneau de navigation et un panneau d'affichage: remplacer la Frame affichée par une autre se fait simplement. Et côté navigation, vous avez le choix entre un tas de Button jusqu'au Treeview.

    Notebook vous propose déjà un système de navigation.

    Il peu être intéressant de partir de là, sachant qu'une grosse partie du boulot sera quand même de récupérer/afficher/interagir avec les informations de chaque Frame.
    La présentation et la navigation entre les pages, c'est pas si compliqué à changer, si ce qui est disponible ne convient pas.

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

Discussions similaires

  1. Etablir 2 connexions SSH l'une dans l'autre
    Par benzebest dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2015, 20h32
  2. Ajout page l'une dans l'autre
    Par jeanmaki dans le forum Langage
    Réponses: 1
    Dernier message: 02/04/2014, 08h37
  3. Mise d'une fenêtre devant les autres
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 22/03/2011, 22h11
  4. Imbriquer un Foreach dans un autre
    Par Freud44 dans le forum C#
    Réponses: 5
    Dernier message: 22/10/2010, 10h37
  5. 2 boucles l'une dans l'autre
    Par everline dans le forum VBScript
    Réponses: 2
    Dernier message: 11/08/2006, 15h58

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