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 :

Qui est le maître ?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut Qui est le maître ?
    Bonjour

    Je ne comprends pas tout sur la notion de maître dans le widgets.

    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
    from tkinter import *
     
    class MonBouton(Frame):
        def __init__(self, boss):
            Frame.__init__(self)
            bou = Button(self, text='Bouton 2')
            bou.pack()
     
    class Application (Frame):
        def __init__(self):        
            Frame.__init__(self)
     
     
            self.bouton1 = Button(self, text='Bouton 1')
            self.bouton1.pack()
     
            self.bouton2 = MonBouton(self)
            self.bouton2.pack()
     
    app = Application()
    app.pack()
    print('app =', id(app))
    print('app.master =', id(app.master))
    print('\napp.bouton1.master =', id(app.bouton1.master))
    print('app.bouton2.master =', id(app.bouton2.master))
    app.mainloop()
    On voit que le bouton 1 est instancié dans app (donc dans une Frame) tandis que le bouton 2 est instancié dans app.master (donc dans une Fenêtre Tk).

    Je ne comprends pas pourquoi. Comment faire pour que le bouton 2 s'instancie aussi dans app ? J'ai essayé avec l'argument boss mais ...

    Merci pour votre aide.

  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,

    Ce que tu appelles self.button2 n'est pas un Button mais un Frame.

    Si je te comprend bien, c'est ceci que tu attend:
    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
     
    from tkinter import *
     
    class MonBouton(Button):
        def __init__(self, text, parent=None):
            super(MonBouton, self).__init__(parent, text=text)
     
    class Application (Frame):
        def __init__(self):        
            Frame.__init__(self)
            self.bouton1 = Button(self, text='Bouton 1')
            self.bouton1.pack()
            self.bouton2 = MonBouton('Bouton 2', self)
            self.bouton2.pack()
     
    app = Application()
    app.pack()
    print('app =', id(app))
    print('app.master =', id(app.master))
    print('\napp.bouton1.master =', id(app.bouton1.master))
    print('app.bouton2.master =', id(app.bouton2.master))
    app.mainloop()
     
    ...
    app = 172124044
    app.master = 172125388
     
    app.bouton1.master = 172124044
    app.bouton2.master = 172124044

  3. #3
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut
    C'est tout à fait cela. Merci beaucoup VinsS.

  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
    Salut,

    Les notions de "master" et de "parent" sont subtiles et Tkinter traduit mal ce que fait Tk "behind the scene".
    Au départ, tous les widgets ont un parent excepte la racine qui est l'application au sens instance de tk.Tk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> import tkinter as tk
    >>> app = tk.Tk()
    >>> frame = tk.Frame(name='frame')
    >>> print (frame)
    .frame
    >>> btn = tk.Button(frame, text='button', name='button')
    >>> print (btn)
    .frame.button
    >>>
    J'ai ajoute name=... pour que ce soit plus parlant. Par défaut, tkinter le construit a partir de l'id.

    C'est une structure hiérarchique semblable a "fichiers et répertoires".

    Le concept de master/slaves est lie au geometry manager.
    Le master sera le "widget" qui contrôle la disposition des "slaves" - affiches "dedans" -.

    Pour l'instant, les widgets ne sont pas affiches, master/slaves n'existent pas encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> app.pack_slaves()
    []
    >>> frame.pack_slaves()
    []
    >>>
    Si on les affiche avec le GM "pack":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> frame.pack()
    >>> btn.pack()
    >>> app.pack_slaves()
    [<tkinter.Frame object at 0x02839CB0>]
    >>> frame.pack_slaves()
    [<tkinter.Button object at 0x02883490>]
    Le "master" sera, par défaut, le "parent".
    Créons un 2eme Button:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> btn2 = tk.Button(app, text='button2', name='button2')
    On peut le "pack"er dans la frame qui deviendra "master" sans être "parent":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> btn2.pack(in_=frame)
    >>> frame.pack_slaves()
    [<tkinter.Button object at 0x02883490>, <tkinter.Button object at 0x029360B0>]
    >>> print(btn2.master)
    .
    >>> btn2.pack_info()
    {'side': 'top', 'fill': 'none', 'anchor': 'center', 'expand': '0', 'ipady': '0',
     'ipadx': '0', 'pady': '0', 'padx': '0', 'in': <tkinter.Tk object at 0x02839A70>}
    Ceci dit, les restrictions sur les in_ (master) possibles:
    The master for each slave must either be the slave's parent (the default) or a descendant of the slave's parent. This restriction is necessary to guarantee that the slave can be placed over any part of its master that is visible without danger of the slave being clipped by its parent.
    rendent l'utilisation de cela assez "tricky" en dehors des cas simples.

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

  5. #5
    Membre confirmé Avatar de Pierrot92320
    Homme Profil pro
    Ingénieur en retraite (électronique)
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur en retraite (électronique)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par défaut
    Merci beaucoup wiztricks pour ce petit cours. J'apprécie beaucoup.

    Il y a juste un truc que j'ai pas compris. Tu dis que btn2 est packé dans la frame, pourtant l'instruction print(btn2.master) renvoie '.' (qui est app). Cela ne devrait pas renvoyer '.frame' ?

  6. #6
    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 Pierrot92320 Voir le message
    Il y a juste un truc que j'ai pas compris. Tu dis que btn2 est packé dans la frame, pourtant l'instruction print(btn2.master) renvoie '.' (qui est app). Cela ne devrait pas renvoyer '.frame' ?
    C'est parce que tkinter appelle "master" ce que Tk désigne comme "parent". Le choix du nom de l'attribut n'est pas très heureux.
    Mais relisez ma prose, ca dit: parent/children ~ master/slaves par défaut.
    btn2 est l'exemple qui montre parent/children != master/slaves

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

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

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. Ne pas afficher un champs qui est vide dans ma BD
    Par yoda_style dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2004, 11h40
  3. [Script] Qui est administrateur ...
    Par ¤FRIX¤ dans le forum Sécurité
    Réponses: 6
    Dernier message: 06/04/2004, 11h58
  4. Réponses: 2
    Dernier message: 16/10/2003, 17h17
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

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