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

Python Discussion :

tkinter .pack() - Probleme d'alignement bouton dans frame [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut tkinter .pack() - Probleme d'alignement bouton dans frame
    Bonjour j'utilise souvent .grid() pour l'inferface graphique mais j'ai un projet ou je dois utilisé .pack()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.frame_resultat #correspond a la zone bleu
    self.frame_parametre #correspond aux zones rouges
    Voici mon bout de code avant mon probleme:

    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
     
            self.i = 0
            for ligne in range(len(self.liste_nom_colonne) // 6):
                self.frame_parametre = Frame(self.frame_resultat, bg='red')
                self.liste_frame_parametre.append(self.frame_parametre)
                self.frame_parametre.pack(fill='x', side='left', anchor='n', expand='true')
     
                for colonne in range(6):
                    self.stringvar_parametre = StringVar(value='{}'.format(self.liste_contenu_parametre_txt_bis[self.i]))
                    self.liste_contenu_parametre_txt_ter.append(self.stringvar_parametre)
                    self.check_button_parametre = Checkbutton(self.frame_parametre,
                                                              text=self.liste_contenu_parametre_txt[self.i],
                                                              offvalue='n', onvalue='o', bg='#F1F8E0',
                                                              variable=self.stringvar_parametre)
                    self.check_button_parametre.pack(side='top', anchor='w', pady=5)
                    self.i += 1
    Nom : image_avant_probleme.PNG
Affichages : 284
Taille : 91,4 Ko
    J'aimerai rajouter un bouton qui prendre toute la longueur en dessous des zones rouges
    Voici mon nouveau code (il y a juste les 2 dernières lignes en plus)
    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
     
            self.i = 0
            for ligne in range(len(self.liste_nom_colonne) // 6):
                self.frame_parametre = Frame(self.frame_resultat, bg='red')
                self.liste_frame_parametre.append(self.frame_parametre)
                self.frame_parametre.pack(fill='x', side='left', anchor='n', expand='true')
     
                for colonne in range(6):
                    self.stringvar_parametre = StringVar(value='{}'.format(self.liste_contenu_parametre_txt_bis[self.i]))
                    self.liste_contenu_parametre_txt_ter.append(self.stringvar_parametre)
                    self.check_button_parametre = Checkbutton(self.frame_parametre,
                                                              text=self.liste_contenu_parametre_txt[self.i],
                                                              offvalue='n', onvalue='o', bg='#F1F8E0',
                                                              variable=self.stringvar_parametre)
                    self.check_button_parametre.pack(side='top', anchor='w', pady=5)
                    self.i += 1
     
            self.bouton_parametre_enregistrer = Button(self.frame_resultat, text='Enregistrer')
            self.bouton_parametre_enregistrer.pack(fill='x', side='bottom')
    Nom : image_probleme.PNG
Affichages : 258
Taille : 95,3 Ko
    Le bouton s'ajoute a droite des frames rouges mais pas en dessous, voila voila merci bien pour votre aide

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

    Créer 2 Frame et un Button pour reproduire le problème est un bon début pour comprendre ce qu'il se passe (et poster un code qui permette de reproduire ce que vous voyez).

    Pour le reste, vu la structure de l'interface, si on veut utiliser "pack" et s'interdire "grid"... Il faut faire le petit exemple mentionné et voir les paramètres sur lesquels jouer pour y arriver (avec le nez dans la documentation pour vérifier la cohérence de ce qu'il se passe vs ce qui y est raconté).

    D'expérience, je dirais que c'est du côté des "side" que ça se joue... mais je n'ai pas testé.

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

  3. #3
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    Oui en effet peut etre mettre un code qui marche pour tous, beh voila jai fais un petit truc pour representé mon probleme donc ca serai les lignes 27 et 28 qui 'bloque'

    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
    from tkinter import *
     
    class Test():
        def __init__(self):
            self.liste_test = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
                               's', 't', 'u', 'v', 'w', 'x', 'y']
            self.fenetre = Tk()
            self.fenetre.minsize(500,300)
            self.frame1 = Frame(self.fenetre, bg='blue')
            self.test()
            self.mainloop()
     
        def test(self):
            self.frame1.pack(expand='true', fill='both')
            self.i = 0
            for ligne in range(5):
                self.frame2 = Frame(self.frame1, bg='red')
                self.frame2.pack(fill='x', side='left', anchor='n', expand='true')
     
                for colonne in range(5):
     
                    self.checkbutton_test = Checkbutton(self.frame2,
                                                                  text=self.liste_test[self.i],
                                                                  offvalue='n', onvalue='o')
                    self.checkbutton_test.pack(side='top', anchor='w', pady=5)
                    self.i += 1
            self.bouton_test = Button(self.frame1, text='Enregistrer')
            self.bouton_test.pack(fill='x', side='bottom', anchor='n')
        def mainloop(self):
            self.fenetre.mainloop()
     
    Test()

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Et ça c'est mieux ?

    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
    from tkinter import *
     
    class Test():
        def __init__(self):
            self.liste_test = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
                               's', 't', 'u', 'v', 'w', 'x', 'y']
            self.fenetre = Tk()
            self.fenetre.minsize(500,300)
            self.frame1 = Frame(self.fenetre, bg='blue')
            self.test()
            self.mainloop()
     
        def test(self):
            self.frame1.pack(expand='true', fill='both')
            self.i = 0
            for ligne in range(5):
                self.frame2 = Frame(self.frame1, bg='red')
                self.frame2.pack(fill='x', side='top', expand='true')
     
                for colonne in range(5):
     
                    self.checkbutton_test = Checkbutton(self.frame2,
                                                                  text=self.liste_test[self.i],
                                                                  offvalue='n', onvalue='o', width=5)
                    self.checkbutton_test.pack(side='left', padx=20)
                    self.i += 1
            self.bouton_test = Button(self.frame1, text='Enregistrer')
            self.bouton_test.pack(fill='x', side='bottom')
        def mainloop(self):
            self.fenetre.mainloop()
     
    Test()
    J'ai tiqué quand j'ai vu les lettres en colonne et non en ligne, est-ce que ça convient ? Sinon il faudra faire une bidouille dans le script pour aller chercher les index correspondants, ou mettre des frames verticales (en colonne) et non horizontales (en ligne).

    Après je ne sais pas s'il y a moyen de faire un tableau sans créer des frames à chaque ligne. Je galère souvent aussi avec pack().

  5. #5
    Membre averti
    Homme Profil pro
    Alternance
    Inscrit en
    Décembre 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternance

    Informations forums :
    Inscription : Décembre 2021
    Messages : 9
    Par défaut
    C'est parfait merci beaucoup

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

    Pour comprendre comment ça fonctionne, il faut jouer avec l'exemple donné dans la documentation.
    Traduit (approximativement) en Python çà donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    tk.Label(text='^^', bg='blue').pack(side='top', fill='x')
    tk.Label(text='vvv', bg='white').pack(side='bottom', fill='x')
    tk.Label(text='<<', bg='green').pack(side='left')
    tk.Label(text='>>', bg='red').pack(side='right')
     
    tk.Label(text='center', bg='grey').pack(expand=1, fill='both')
    tk.mainloop()
    Intuitivement, j'ai un centre et des côtés (remplis par side=...). Et comme le remplissage se fait en fonction de ce qui reste dans ce qui est appelé "cavity", l'ordre de placement des widgets est important (ils grignotent la "cavity" et éventuellement l'étendent).

    Si on veut créer un tas de widgets alignés horizontalement, on va pouvoir utiliser side 'left' (ou 'right') mais il ne faut pas oublier le widget du centre (qui sera le premier ou le dernier à ajouter). Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import tkinter as tk
     
    tk.Label(text='vvv', bg='blue').pack(side='bottom', fill='x')
    tk.Label(text='<<1', bg='green').pack(side='left')
    tk.Label(text='<<2', bg='green').pack(side='left')
    tk.Label(text='<<3', bg='green').pack(side='left')
    tk.Label(text='center', bg='grey').pack(expand=1, fill='both')
     
    tk.mainloop()
    note: je n'ai utilisé que des Label mais un widget reste un widget et on peut remplacer ces Labels par des Frame contenant ce qu'on veut, pack travaille avec les dimensions du widget à afficher et se fout pas mal de ce qu'il contient.

    Citation Envoyé par LeNarvalo Voir le message
    Après je ne sais pas s'il y a moyen de faire un tableau sans créer des frames à chaque ligne. Je galère souvent aussi avec pack().
    Pour faire un tableau, on utilisera "grid". Ici, on ne fait pas un tableau mais on affiche un tas de widgets alignés et au dessous un widget qui s'étend sur la longueur. Ce qu'on peut faire avec "pack" en essayant de comprendre comment pack fonctionne... ou en découpant le problème avec des Frame en sus.

    Dans tous les cas, on essaie d'avoir un rendu avec un minimum de widgets et un minimum de Frame d'emballage (c'est pour ça qu'ici, il vaut mieux utiliser grid puisqu'on se retrouve à créer autant de Frame qu'il y a de lignes: çà va être plus compliqué pour adresser les différents widgets).

    - 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. [Python 3.X] Aligner et étendre boutons dans une Frame
    Par brunop33 dans le forum Tkinter
    Réponses: 2
    Dernier message: 03/12/2020, 13h55
  2. Alignement bouton dans la page
    Par asvin dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 08/12/2008, 23h23
  3. alignement boutons dans un Tpanel
    Par softstar dans le forum Delphi
    Réponses: 8
    Dernier message: 14/08/2006, 21h13
  4. Bouton dans un frame
    Par hbzied dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 08/05/2006, 19h05
  5. Ouvrir une frame avec un bouton dans une frame
    Par argon dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 25/03/2006, 10h48

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