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 empêcher des widgets slaves de dicter leurs propres positions ?


Sujet :

Tkinter Python

  1. #1
    Candidat au Club Avatar de Aseis
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Comment empêcher des widgets slaves de dicter leurs propres positions ?
    J'ai donc deux Frame, un TextFrame centré et une toolbar avec des Buttons dedans. Je veux que la barre d'outils soit en haut, donc j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.toolbar.pack(side='top', pady=60)
    mais cela ne semble pas suffisant.

    Les boutons, qui sont slaves de la Frame 'toolbar', semblent dicter leur propre position : si j'en mets un à gauche, il va sur le côté gauche de toute la fenêtre. Au lieu de cela, j'aimerais pouvoir placer une fois la Frame master de ma toolbar, et ensuite empaqueter mes boutons, côte à côte, en utilisant donc quelque chose comme l'attribut side qui modifie actuellement leur position globale.

    Comment puis-je y parvenir ? Mon approche de la POO est-elle mal écrite ?

    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
    import tkinter as tk
     
     
    class ToolbarButton(tk.Button):
     
        def __init__(self, master, text, pixelref, *args, **kw):
            super(ToolbarButton, self).__init__()
            self.master = master
            super(ToolbarButton, self).configure(text=text, image=pixelref, height=20, width=20, compound='center')
     
     
    class MainApplication(tk.Frame):
        def __init__(self, parent, *args, **kwargs):
            tk.Frame.__init__(self, parent, *args, **kwargs)
            self.parent = parent
     
            # Textframe - ici j'ai juste créé un widget text qui remplit tout l'espace donné par sa frame master, appelée text_frame ci-dessous
            self.text_frame = tk.Frame(root, width=600, height=790)
            self.text_frame.pack_propagate(False)
            self.text_widg = tk.Text(self.text_frame, width=1, height=1)
            self.text_widg.pack(expand=True, fill='both') 
     
            # Toolbar
            self.toolbar = tk.Frame(root)
            self.pixel = tk.PhotoImage(width=1, height=1)
     
            self.bold_button = ToolbarButton(self.toolbar, 'B', self.pixel)
            self.bold_button.pack(side='left', padx=4)
            self.italic_button = ToolbarButton(self.toolbar, 'I', self.pixel)
            self.italic_button.pack(side='left', padx=4)
            self.underline_button = ToolbarButton(self.toolbar, 'U', self.pixel)
            self.underline_button.pack(side='left', padx=4)
     
            # Packing
            self.toolbar.pack(side='top', pady=60)
            self.text_frame.pack(expand=True)
     
     
    if __name__ == "__main__":
        root = tk.Tk()
        MainApplication(root).pack(side="top", fill="both", expand=True)
        root.mainloop()
    Merci à vous !

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Je n'ai pas l'habitude d'utiliser la méthode super() mais d'après ce que j'ai compris de ce lien :
    1) vous utilisez la syntaxe de Python 2.x au moment d'appeler le constructeur de la classe mère (ligne 7)
    2) vous créez une variable self.master en lui attribuant la valeur master ; pourquoi pas, mais je crois que ça ne sert à rien car je doute que le code "reconnaisse" le master uniquement parce que vous l'appelez comme cela (ligne 8)
    3) c'est probablement encore une erreur de syntaxe mais étant donné que votre objet a hérité des méthodes de tk.Button, vous pouvez appeler la méthode configure() qui lui appartient déjà => self.configure(...) (ligne 9)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class ToolbarButton(tk.Button):
        def __init__(self, master, text, pixelref, *args, **kw):
            super().__init__(master)
            self.configure(text=text, image=pixelref, height=20, width=20, compound='center')
    De mon côté, avec ces modifications, ça marche

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Le principe de base lorsqu'on a un problème est de le réduire pour enlever tout ce qui ne sert pas à le reproduire.

    Pour le reste... MainApplication hérite de tk.Frame mais il n'y a pas de widget créé avec "self" comme parent. Les 2 Frames créées dans l'__init__ ont pour parent "root". Ce n'est pas très cohérent! Et de plus côté POO, si MainApplication est un widget, .destroy() devrait détruire l'arbre de widgets qui lui est accroché.

    ToolbarButton est un tk.Button... si on lui passe un parent, il faut l'utiliser car par défaut ce sera "root" (et pas vraiment ce que vous voulez).

    La POO et tkinter sont des choses "compliquées". Vous avez la chance de démarrer un tkinter qui vous permet de faire plein de choses sans avoir à écrire "class": profitez en pour commencer par un tk.Button puis lorsque çà fonctione, le promouvoir en ToolbarButton si çà apporte quelque chose....

    - W

  4. #4
    Candidat au Club Avatar de Aseis
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par charliemtx Voir le message
    Merci beaucoup ! Je n'avais pas du tout pensé à vérifier de ce côté là : je n'avais en tête que les placements et le packing. Revoir les bases de la POO en Python ne me fera pas de mal du coup

    Citation Envoyé par wiztricks Voir le message
    Vous avez raison, comme dit plus haut je restais un peu bloqué sur le problème même de placement sans prendre de recul.
    Pour le cas du bouton, la réécriture du code par charliemtx semble gommer l'erreur - ou n'ai-je pas bien compris votre point ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par Aseis Voir le message
    ou n'ai-je pas bien compris votre point ?
    Ce n'est pas la seule "erreur..." (ou truc qui ne servira qu'à chercher l'erreur là où elle n'est pas... ).

    - W

  6. #6
    Candidat au Club Avatar de Aseis
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce n'est pas la seule "erreur..." (ou truc qui ne servira qu'à chercher l'erreur là où elle n'est pas... ).

    - W
    Dans ce cas qu'y a-t-il à revoir ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    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 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par Aseis Voir le message
    Dans ce cas qu'y a-t-il à revoir ?
    Il me semble vous avoir donné quelques pistes.

    - W

Discussions similaires

  1. [2.x] Comment ajouter des widgets à un object Form
    Par DanaKil dans le forum Symfony
    Réponses: 0
    Dernier message: 23/05/2012, 17h07
  2. [Toutes versions] Comment valoriser des postes de détail si leur tarif évolue dans le temps ?
    Par Shades dans le forum Access
    Réponses: 3
    Dernier message: 02/02/2012, 13h12
  3. [lablgtk2] comment ajouter des widget dynamiquement?
    Par amiroushka dans le forum Caml
    Réponses: 4
    Dernier message: 06/11/2009, 22h21

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