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 :

Aide compréhension code tkinter


Sujet :

GUI Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    magasinié
    Inscrit en
    Décembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : magasinié

    Informations forums :
    Inscription : Décembre 2018
    Messages : 34
    Par défaut Aide compréhension code tkinter
    Bonjour,

    J'aimerais une aide pour comprendre ce code :
    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
    import tkinter as tk
     
    LARGE_FONT = ('Verdanna',12)
     
    class SeaofBTCCApp(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self,*args,**kwargs)
            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.frames = {}
            for F in (StartPage,PageOne,PageTwo):
     
                frame = F(container,self)
                frame.grid(row=0,column=0,sticky='nsew')
                self.frames[F] = frame
     
     
            self.show_frame(StartPage) #pour l'instant ne fait rien
     
        def show_frame(self,cont):
            frame = self.frames[cont]
            frame.tkraise()
     
    class StartPage(tk.Frame):
        def __init__(self, parent,controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self,text='Home',font = LARGE_FONT)
            label.pack(pady=10,padx=10)
            button1 = tk.Button(self,text='Page 1',
            command = lambda:controller.show_frame(PageOne))
            button1.pack()
     
            button2 = tk.Button(self,text='Page 2',
            command = lambda:controller.show_frame(PageTwo))
            button2.pack()
     
    class PageOne(tk.Frame):
        def __init__(self, parent,controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self,text='Page 1',font = LARGE_FONT)
            label.pack(pady=10,padx=10)
            button1 = tk.Button(self,text='Home',
            command = lambda:controller.show_frame(StartPage))
            button1.pack()
     
            button2 = tk.Button(self,text='Page 2',
            command = lambda:controller.show_frame(PageTwo))
            button2.pack()
     
    class PageTwo(tk.Frame):
        def __init__(self, parent,controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self,text='Page 2',font = LARGE_FONT)
            label.pack(pady=10,padx=10)
            button1 = tk.Button(self,text='Home',
            command = lambda:controller.show_frame(StartPage))
            button1.pack()
     
            button2 = tk.Button(self,text='Page 1',
            command = lambda:controller.show_frame(PageOne))
            button2.pack()
     
     
    app = SeaofBTCCApp()
    app.mainloop()
    Je ne comprend pas du tout comment il marche --'
    Pour ajouter une page j'ai bien compris quoi changer etc sauf que je ne comprend pas le pourquoi du comment il fonctionne

    Merci bonne soirée

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Apparemment ce code "crée" plusieurs frames et on peut afficher telle ou telle frame en cliquant sur les boutons...

  3. #3
    Membre averti
    Homme Profil pro
    magasinié
    Inscrit en
    Décembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : magasinié

    Informations forums :
    Inscription : Décembre 2018
    Messages : 34
    Par défaut
    Salut,

    Oui j'ai bien compris sauf que je ne comprend pas comment il marche

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ben est-ce qu'il y a une partie en particulier que tu ne comprends pas ?

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    Votre code vient de : How to change and show a new window in Tkinter


    C'est frame.tkraise() qui parcours les frames.

    Citation Envoyé par https://www.developpez.net/forums/d1598097/autres-langages/python/gui/tkinter/switcher-d-frame/
    "raise" permets de placer "devant" (ou au-dessus) un widget qui serait masqué par un autre. On pourrait avoir ce cas-là en affichant les deux widgets avec .place (à la même position par exemple).

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre averti
    Homme Profil pro
    magasinié
    Inscrit en
    Décembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : magasinié

    Informations forums :
    Inscription : Décembre 2018
    Messages : 34
    Par défaut
    Je ne comprend pas l'appel de la méthode show_frame qui marche en dehors de la class ni comment elle marche vraiment.
    La boucle je n'arrive pas à comprend comment elle marche non plus ^^

    En gros je n'ai pas compris grand chose

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par outiat Voir le message
    Je ne comprend pas l'appel de la méthode show_frame qui marche en dehors de la class ni comment elle marche vraiment.
    La réponse rapide est que c'est une méthode du contrôleur que chaque page reçoit en argument. Et la méthode longue serait de vous expliquer des rudiments de POO mais vous trouverez cela dans n'importe quel bon tuto.


    La boucle je n'arrive pas à comprend comment elle marche non plus ^^
    La seule boucle du code est celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            for F in (StartPage,PageOne,PageTwo):
     
                frame = F(container,self)
                frame.grid(row=0,column=0,sticky='nsew')
                self.frames[F] = frame
    Les class sont des objets comme les autres.

    On peut donc créer un tuple (StartPage,PageOne,PageTwo) sur lequel itérer pour créer chaque page, l'afficher en ligne, colonne = (0, 0) et sauvegarder l'instance associée à la page/class dans un dictionnaire.

    Le grid manager va empiler tout çà au même endroit et vous verriez la dernière page créée s'afficher s'il n'y avait pas le self.show_frame(StartPage) pour placer "StartPage" au dessus (et la rendre visible).

    Citation Envoyé par outiat Voir le message
    En gros je n'ai pas compris grand chose
    On peut écrire un programme qui fait la même chose sans POO et sans empiler les frames, ...

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

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par outiat Voir le message
    La boucle je n'arrive pas à comprend comment elle marche non plus ^^
    Cette boucle "crée" les trois frames StartPage, PageOne et PageTwo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for F in (StartPage, PageOne, PageTwo):     frame = F(container, self)    frame.grid(row=0, column=0, sticky='nsew')    self.frames[F] = frame
    L’instruction frame = F(container, self) équivaut à frame = StartPage(container, self) au premier tour de boucle... Elle équivaut à frame = PageOne(container, self) au second tour de boucle et à frame = PageTwo(container, self) au troisième tour de boucle. Chacune de ces trois frames est stockée dans le dico self.frames
    Citation Envoyé par outiat Voir le message
    Je ne comprend pas l'appel de la méthode show_frame qui marche en dehors de la class ni comment elle marche vraiment.
    Ben cette fonction affiche une des trois frames contenues dans le dico self.frames dont on a parlé ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def show_frame(self, cont):     frame = self.frames[cont]     frame.tkraise()
    Le frame à afficher est sectionnée via le paramètre cont... La fonction est lancée quand on clique sur un bouton, par exemple quand on clique sur ce bouton: button1 = tk.Button(self, text='Page 1', command=lambda: controller.show_frame(PageOne)) le paramètre cont vaudra PageOne et c'est donc cette frame qui sera affichée.
    Citation Envoyé par outiat Voir le message
    Je ne comprend pas l'appel de la méthode show_frame qui marche en dehors de la class ni comment elle marche vraiment.
    Je ne suis pas sûr de comprendre ce que tu veux dire par "qui marche en dehors de la class" mais cette fonction est une méthode de la class SeaofBTCCApp et controller est une instance de cette class donc on peut lancer cette fonction en faisant par exemple : controller.show_frame(PageOne) tout comme app.show_frame(PageOne)...

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah ben wiztricks a déjà répondu, je n'avais pas vu sa réponse...

Discussions similaires

  1. Aide compréhension d'un code
    Par Tagazouh dans le forum Débuter
    Réponses: 4
    Dernier message: 17/02/2012, 18h12
  2. Aide - Compréhension code - $this->{$element->helper}()
    Par omageus dans le forum Zend Framework
    Réponses: 2
    Dernier message: 16/03/2010, 18h09
  3. [Mail] Besoin d'aide sur code email avec PJ
    Par flysurfer dans le forum Langage
    Réponses: 1
    Dernier message: 23/02/2006, 10h52
  4. besoin d'aide sur code Block
    Par Antalus dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 31/01/2006, 18h38
  5. Remplissage de TStringGrid à l'aide du code
    Par the watcher dans le forum Bases de données
    Réponses: 4
    Dernier message: 14/10/2005, 16h16

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