Partage
  • Partager sur Facebook
  • Partager sur Twitter

l'objet Frame

Sujet résolu
    28 janvier 2015 à 17:55:28

    Salut everybody, comment puis-je faire pour ne pas que la taille du frame s'adapte automatiquement à ce que j'y met dedans, alors que j'ai au préalable définis la taille de mon frame.

    On gros mon code donne :

    from tkinter import *
    
    fenetre = Tk()
    frame1 = Frame(fenetre, height = 500, width = 600)
    fram1.grid()
    frame2 = Frame(fenetre, height = 500, width = 600)
    fram2.grid()
    Label(frame1, text = " ... ").pack()
    
    #Je définis la taille du frame, puis lorsque je met un label
    #dedans, le frame est automatiquement redimensionné
    #Or je voudrais qu'il garde sa taille d'origine.





    -
    Edité par No_breakout 28 janvier 2015 à 17:57:41

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 janvier 2015 à 18:15:23

      Tu travailles avec une grille (utilisation de grid), il faut donc spécifier les paramètres row et column de cette méthode.

      Ensuite tu utilises pack, pourquoi ? C'est soit on travaille avec une grille, soit on travaille par empaquetage, faut choisir ! Les deux sont incompatibles selon la façon utilisée dans ton code.

      • Partager sur Facebook
      • Partager sur Twitter
        28 janvier 2015 à 18:23:13

        Dans mon véritable code je n'utilise que grid(), là j'ai écris un exemple de code vite fait, mais ce n'est pas le pack() le problème, si tu veux je remet mon code en changeant juste le pack(), mais c'est chercher la petite bête.

        Et spécifier row et column dans le grid() ne change rien, j'ai déjà essayé.

        from tkinter import *
         
        fenetre = Tk()
        frame1 = Frame(fenetre, height = 500, width = 600)
        fram1.grid(row = 0, column = 0)
        frame2 = Frame(fenetre, height = 500, width = 600)
        fram2.grid(row = 0, column = 1)
        Label(frame1, text = " ... ").grid(row = 0, column = 0)
         
        #Je définis la taille du frame, puis lorsque je met un label
        #dedans, le frame est automatiquement redimensionné
        #Or je voudrais qu'il garde sa taille d'origine.



        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 janvier 2015 à 19:02:11

          Faudrait essayer de voir du côté de grid_propagate ou pack_propagate, selon le choix que tu feras dans ton geometry manager.

          Dans tous les cas ton code n'est pas testable en l'état (voir tes noms de variables).

          • Partager sur Facebook
          • Partager sur Twitter
            28 janvier 2015 à 19:21:34

            oui, c'est bizarre, je ne comprends pas pourquoi frame1 rétrécit lorqu'on y insère un Label

            Tu peux voir cette page: http://www.gigante.be/python/didact_002.php

            tout en bas, au dernier schéma. C'est à peu près ce que tu fais et ça marche.

            Ajout

            Euh non, même dans l'exemple sur www.gigante.be ça ne marche pas. Si j'enlève les 3 'entry' la frame jaune rétrécit autour du texte Label.

            -
            Edité par ast2 28 janvier 2015 à 19:33:31

            • Partager sur Facebook
            • Partager sur Twitter
              29 janvier 2015 à 19:02:52

              Oui je comprend vraiment pas pourquoi le Frame rétrécit alors que j'ai définis sa taille juste avant, WTF ?

              • Partager sur Facebook
              • Partager sur Twitter
                29 janvier 2015 à 22:09:25

                Comme ceci:

                #!/usr/bin/env python3
                # -*- coding: utf-8 -*-
                
                from tkinter import *
                
                fenetre = Tk()
                
                frame1 = Frame(fenetre, height=400, width=600, bg='red')
                frame1.pack(fill=BOTH, expand=True)
                frame1.pack_propagate(False)
                
                Label(frame1, text = " ... ").pack()
                
                frame2 = Frame(fenetre, height = 400, width = 600, bg='blue')
                frame2.pack(fill=BOTH, expand=True)
                
                fenetre.mainloop()
                

                Le comportement par défaut des différents manager de géométrie est de se redimensionner aux widget que contient le widget parent. Il suffit comme l'a dit OldProgrammer d'invoquer pack_propagate(False) sur le parent pour qu'il ne se redimensionne pas aux enfants qu'il contient.

                -
                Edité par Dan737 27 mars 2017 à 15:35:24

                • Partager sur Facebook
                • Partager sur Twitter
                  29 janvier 2015 à 22:29:52

                  Merci beaucoup pour vos réponses OldProgrammer et Dan737, cela répond entièrement à mon problème.

                  Et encore désolé de déranger pour un truc aussi simple, j'essaye de regarder dans la doc avant de poster, mais je ne suis pas habitué à lire la doc bien que l'anglais ne me pose pas trop de soucis, c'est surtout que j'ai beaucoup de mal à m'y retrouver dans la doc.

                  Et un grand merci particulièrement à toi Dan737 parce que ça fait déjà plusieurs fois que tu résous mes problèmes:soleil:, mais j'en ai encore d'autres en réserve :p 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 janvier 2015 à 8:28:15

                    Pour moi tout ça n'est pas très clair

                    si je mets:

                    frame1.pack()
                    Label(frame1, text = " ... ").pack()

                    frame1 rétrécit verticalement mais pas horizontalement et le label s'étend horizontalement par dessus frame1. La couleur rouge de frame1 n'est plus visible.

                    si je mets:

                    frame1.pack(fill=X)
                    Label(frame1, text = " ... ").pack()

                    frame1 rétrécit verticalement mais pas horizontalement et cette fois le label a la bonne taille au centre de frame1. frame1 en rouge est bien visible.


                    si je mets:

                    frame1.pack(side=TOP, fill=X)
                    frame1.pack_propagate(False)
                    Label(frame1, text = " ... ").pack()

                    Cette fois frame1 ne rétrécit plus et le label a la bonne taille au bon endroit

                    Difficile quand même de saisir la logique du layout manager pack().

                    -
                    Edité par ast2 30 janvier 2015 à 8:54:02

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 janvier 2015 à 9:03:16

                      C'est pas si bizarre que ça. Quand on utilise la méthode pack sans arguments, on place les widgets verticalement les uns par rapport aux autres. Dans ce cas, le geometry manager s'assure que la hauteur de chaque widget est la plus petite possible afin d'en mettre le plus possible. Pour calculer la hauteur minimum, il regarde s'il y a des widgets enfants et calcul leur hauteur de la même manière. Donc ça veut dire que par défaut la taille (ici hauteur) d'un widget est déterminée par le geometry manager de ses enfants. S'il n'y a pas d'enfants widget, il prend tout de même par défaut la hauteur spécifiée (ce qui peut initialement étonné). Mais c'est logique puisqu'il n'existe aucun enfant pour lui dire quoi faire.

                      Si on place les éléments côte à côte, on aura l'effet inverse: la largeur de la première frame où se trouve le Label va être réduite alors que la deuxième pas. Par contre la hauteur va rester inchangée.

                      #!/usr/bin/env python3
                      # -*- coding: utf-8 -*-
                      
                      from tkinter import *
                      
                      fenetre = Tk()
                      
                      frame1 = Frame(fenetre, height=400, width=600, bg='red')
                      frame1.pack(fill=BOTH, side=LEFT)
                      
                      Label(frame1, text = " ... ").pack()
                      
                      frame2 = Frame(fenetre, height = 400, width = 600, bg='blue')
                      frame2.pack(fill=BOTH, side=LEFT)
                      
                      fenetre.mainloop()
                      

                      Le fait d'utiliser pack_propagate(False) dit simplement aux enfants widgets de ne pas intervenir dans la géométrie du parent. Ainsi la Frame se comporte comme s'il n'y avait pas d'enfants et utilise dès lors ses propres dimensions, sans essayer de contenir tous les widgets enfants.

                      EDIT: @ast2, je répondais alors que tu éditais ta question. :) Je réponds ici à ce que je vois à présent.

                      Voici l'algorithme de pack Donc comme tu peux le lire, au moment où il regarde chaque enfant, une zone rectangulaire dans le maître (notre frame1) est non allouée. Cette zone s'appelle la cavité et pour le premier enfant elle correspond à la taille entière de frame1. Sous le point 1, il est bien dit que si side=TOP (ce qui est notre cas), la largeur de l'enfant vaudra la largeur de la cavité. Donc les 600px.

                      Dans le deuxième cas, où tu écris frame1.pack(fill=X), on est dans le point 2.

                      However, if the -fill option is x or both then the width of the slave is expanded to fill the width of the parcel, minus twice the -padx option. Donc notre Labelva remplir sa parcelle et non sa cavité. Et ainsi on voit le rouge de la Frame.

                      -
                      Edité par Dan737 30 janvier 2015 à 9:37:19

                      • Partager sur Facebook
                      • Partager sur Twitter

                      l'objet Frame

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown