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 :

largeur d'une frame [Python 3.X]


Sujet :

Python

  1. #1
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    651
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 651
    Par défaut largeur d'une frame
    Je suis parfaitement débutant en python....

    j'ai un code de test qui débute avec


    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
    import tkinter as tk
     
        from matplotlib.pyplot import text
        .....
       fenetre = tk.Tk()
       Center_Frame = tk.Frame(fenetre, borderwidth=7, pady=5, width=222)
     
        frame_center_Left=tk.Frame(Center_Frame, borderwidth=2, relief='sunken', width=111, bg='blue')
        frame_center_Right=tk.Frame(Center_Frame, borderwidth=2, relief='raised', width=111, bg='yellow')
     
        frame_center_Left.grid(row=0, column=0) 
        frame_center_Right.grid(row=0, column=1) 
     
     
        btn_Left=tk.Button(frame_center_Left, text='B left')
        btn_Lef.pack()
        btn_Right=tk.Button(frame_center_Right, text='B droite')
        btn_Right.pack(side = "right")
    Je m'attendais à avoir un frame de 222 de large avec 2 sous fenêtres de 111 de large et un bouton 'tout à gauche et un autre tout à droite.

    En fait tout est ramassé au centre.
    Où est la blague?


    J'arrive plus ou moind à mon objectif en faisant un truc truc TRES sale du type:
    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
     
     
        frame_center_1=tk.Frame(Center_Frame, borderwidth=2, relief='sunken', width=300, bg='blue')
        frame_center_2=tk.Frame(Center_Frame, borderwidth=2, relief='raised', width=300, bg='yellow')
        frame_center_BAD=tk.Frame(Center_Frame, borderwidth=2,  width=300, bg='white')
     
        frame_center_1.grid(row=0, column=0) 
        frame_center_BAD.grid(row=0, column=1) 
        frame_center_2.grid(row=0, column=2) 
     
        lb=tk.Label(frame_center_BAD,text='                 ')
     
        btn1=tk.Button(frame_center_1, text='B left')
        btn1.pack()
        btn2=tk.Button(frame_center_2, text='B droite')
        btn2.pack(side = "right")

    Question subsidiaire:

    Peut on passe une variable dans width?
    Par exemple quelque chose du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Mon_Width=500
        frame_center_Left=tk.Frame(Center_Frame, borderwidth=2, relief='sunken', width="mon_width", bg='blue')
    Merci pour vos réponses!

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 595
    Par défaut
    Hello,

    La "blague", comme vous dites, réside dans la manière dont Tkinter calcule la taille des widgets.

    La solution la plus propre et la plus "Tkinter-esque", qui évite votre "truc sale" (qui est ingénieux, mais peu maintenable), repose sur deux concepts clés :

    • 1. Désactivation de la propagation de la géométrie : Par défaut, un Frame géré par .grid() ou .pack() va propager sa géométrie, c'est-à-dire qu'il va rétrécir ou s'agrandir pour s'adapter parfaitement à ses enfants. La solution optimum consiste à désactiver ce comportement sur les Frame dont vous souhaitez fixer la taille (comme frame_center_Left et frame_center_Right).
    • 2. Configuration des poids de la grille : Votre solution "sale" utilise une colonne vide (colonne 1) pour créer de l'espace. La bonne pratique est de dire au gestionnaire .grid() de Center_Frame comment il doit distribuer l'espace. Vous pouvez assigner un "poids" (weight) à vos colonnes (0 et 2) pour qu'elles s'étirent, et peut-être un poids différent à la colonne du milieu (1) pour qu'elle serve d'espaceur dynamique.


    Votre premier exemple de code est très clair sur le problème, mais il n'est pas complet (on ne voit pas comment Center_Frame est placée dans fenetre, ni l'mainloop).
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre émérite
    Inscrit en
    Juin 2005
    Messages
    651
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 651
    Par défaut taille frame
    Merci pour votre réponse très rapide!

    vous notez:
    1. Désactivation de la propagation de la géométrie : Par défaut, un Frame géré par .grid() ou .pack() va propager sa géométrie, c'est-à-dire qu'il va rétrécir ou s'agrandir pour s'adapter parfaitement à ses enfants. La solution optimum consiste à désactiver ce comportement sur les Frame dont vous souhaitez fixer la taille (comme frame_center_Left et frame_center_Right).
    2. Configuration des poids de la grille : Votre solution "sale" utilise une colonne vide (colonne 1) pour créer de l'espace. La bonne pratique est de dire au gestionnaire .grid() de Center_Frame comment il doit distribuer l'espace. Vous pouvez assigner un "poids" (weight) à vos colonnes (0 et 2) pour qu'elles s'étirent, et peut-être un poids différent à la colonne du milieu (1) pour qu'elle serve d'espaceur dynamique.
    Pourriez vous donner un exemple pour implémenter ceci en python?

    Meri par avance!

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 595
    Par défaut
    Pour le 1

    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
    import tkinter as tk
    from tkinter import ttk
     
    def main():
        # 1. Créer la fenêtre principale
        root = tk.Tk()
        root.title("Désactivation de la Propagation de la Géométrie")
     
        # 2. Créer le Frame auquel on veut fixer la taille
        fixed_frame = ttk.Frame(root, borderwidth=2, relief="solid")
        # Utilisation de .pack() pour placer le frame dans la fenêtre root
        fixed_frame.pack(padx=20, pady=20)
     
        # --- Définition de la taille fixe du Frame ---
        # Définir la largeur et la hauteur souhaitées pour le Frame
        fixed_width = 300
        fixed_height = 150
        fixed_frame.config(width=fixed_width, height=fixed_height)
     
        # 3. Désactiver la propagation de la géométrie !
        # Sans cette ligne, le Frame rétrécirait pour ne contenir que le bouton.
        fixed_frame.pack_propagate(0) 
     
        # 4. Ajouter un widget enfant plus petit que le Frame
        # Ce widget sera placé dans le Frame `fixed_frame`
        small_label = ttk.Label(fixed_frame, text="Je suis un petit Label.")
        # Centrer le label dans le Frame
        small_label.place(relx=0.5, rely=0.5, anchor="center") 
     
        # 5. Créer un second Frame pour montrer le comportement par défaut (propagation active)
        propagating_frame = ttk.Frame(root, borderwidth=2, relief="groove")
        propagating_frame.pack(padx=20, pady=10)
        # Tenter de lui fixer une taille (qui sera ignorée car propagation active par défaut)
        propagating_frame.config(width=50, height=50) 
     
        # Laisser la propagation active (comportement par défaut)
        # propagating_frame.pack_propagate(1) # C'est la valeur par défaut
     
        # Ajouter un widget enfant
        big_label = ttk.Label(propagating_frame, text="Je propage et m'agrandis !")
        big_label.pack(padx=10, pady=10)
     
        # Lancement de la boucle principale Tkinter
        root.mainloop()
     
    if __name__ == '__main__':
        main()
    Pour le 2

    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
    import tkinter as tk
    from tkinter import ttk
     
    def main():
        # 1. Créer la fenêtre principale
        root = tk.Tk()
        root.title("Configuration des Poids de la Grille (Grid Weight)")
        root.geometry("450x200") # Définir une taille initiale pour mieux voir l'effet
     
        # 2. Créer le Frame conteneur (Center_Frame dans votre description)
        center_frame = ttk.Frame(root, borderwidth=2, relief="groove")
        # Utiliser .pack() pour que le frame remplisse la fenêtre
        center_frame.pack(fill="both", expand=True, padx=10, pady=10)
     
        # 3. Configuration des poids de la grille du Center_Frame (la solution propre)
     
        # --- Objectif : Colonnes 0 et 2 doivent s'étirer, Colonne 1 doit servir d'espaceur ---
     
        # Configuration de la Colonne 0 (le bouton de gauche)
        # Poids = 1 : Cette colonne s'étire.
        center_frame.grid_columnconfigure(0, weight=1) 
     
        # Configuration de la Colonne 1 (l'espaceur dynamique)
        # Poids = 5 : Cette colonne prendra la majeure partie de l'espace disponible (5 fois plus que col 0 et col 2).
        center_frame.grid_columnconfigure(1, weight=5)
     
        # Configuration de la Colonne 2 (le bouton de droite)
        # Poids = 1 : Cette colonne s'étire de la même manière que la colonne 0.
        center_frame.grid_columnconfigure(2, weight=1) 
     
        # 4. Ajouter les widgets enfants
     
        # Bouton de Gauche (Colonne 0)
        btn_left = ttk.Button(center_frame, text="Gauche (Col 0)")
        # Le 'sticky="w"' assure que le widget s'ancre à l'ouest dans son espace.
        btn_left.grid(row=0, column=0, padx=5, pady=5, sticky="w")
     
        # Espaceur "virtuel" (Colonne 1)
        # On peut y placer un widget, ou le laisser vide ; c'est le poids qui gère l'espace.
        # Ici, on place un petit label pour marquer l'espace, mais il n'est pas nécessaire.
        spacer_label = ttk.Label(center_frame, text="")
        spacer_label.grid(row=0, column=1) # L'espace est créé par le poids de la colonne
     
        # Bouton de Droite (Colonne 2)
        btn_right = ttk.Button(center_frame, text="Droite (Col 2)")
        # Le 'sticky="e"' assure que le widget s'ancre à l'est dans son espace.
        btn_right.grid(row=0, column=2, padx=5, pady=5, sticky="e")
     
        # 5. Lancement de la boucle principale Tkinter
        root.mainloop()
     
    if __name__ == '__main__':
        main()
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

Discussions similaires

  1. [flash] ouvrir une page dans une frame différente
    Par viena dans le forum Intégration
    Réponses: 6
    Dernier message: 01/08/2007, 16h54
  2. largeur d'une frame
    Par delas dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/11/2005, 16h12
  3. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 11h35
  4. qu'est ce qu'une frame?
    Par vincetrader dans le forum Développement
    Réponses: 3
    Dernier message: 25/02/2004, 12h24
  5. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 16h35

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