web-dev-qa-db-fra.com

Comment définir la hauteur ou la largeur min et max d'un cadre?

La taille des fenêtres Tkinter peut être contrôlée via les méthodes suivantes:

.minsize()
.maxsize()
.resizable()

Existe-t-il des moyens équivalents de contrôler la taille des cadres Tkinter ou ttk?

@Bryan: J'ai changé votre code frame1.pack comme suit:

frame1.pack(fill='both', expand=True)
frame1.bind( '<Configure>', maxsize )

Et j'ai ajouté ce gestionnaire d'événements:

# attempt to prevent frame from growing past a certain size
def maxsize( event=None ):
    print frame1.winfo_width()
    if frame1.winfo_width() > 200:
        print 'frame1 wider than 200 pixels'
        frame1.pack_propagate(0)
        frame1.config( width=200 )
        return 'break'

Le gestionnaire d'événements ci-dessus détecte que la largeur d'une trame est trop grande, mais ne peut pas empêcher l'augmentation de taille de se produire. Est-ce une limitation de Tkinter ou ai-je mal compris votre explication?

20
Malcolm

Il n'y a pas de fonction magique unique pour forcer un cadre à une taille minimale ou fixe. Cependant, vous pouvez certainement forcer la taille d'un cadre en lui donnant une largeur et une hauteur. Vous devez alors faire potentiellement deux autres choses: lorsque vous placez cette fenêtre dans un conteneur, vous devez vous assurer que le gestionnaire de géométrie ne réduit pas ou n'agrandit pas la fenêtre. Deuxièmement, si le cadre est un conteneur pour un autre widget, désactivez la grille ou la propagation du pack afin que le cadre ne se rétrécisse pas ou ne se développe pas pour s'adapter à son propre contenu.

Notez cependant que cela ne vous empêchera pas de redimensionner une fenêtre pour qu'elle soit plus petite qu'un cadre interne. Dans ce cas, le cadre sera juste coupé.

import Tkinter as tk

root = tk.Tk()
frame1 = tk.Frame(root, width=100, height=100, background="bisque")
frame2 = tk.Frame(root, width=50, height = 50, background="#b22222")

frame1.pack(fill=None, expand=False)
frame2.place(relx=.5, rely=.5, anchor="c")

root.mainloop()
24
Bryan Oakley

Une solution de contournement - au moins pour la taille minimale: vous pouvez utiliser la grille pour gérer les cadres contenus dans root et les faire suivre la taille de la grille en définissant sticky = 'nsew'. Ensuite, vous pouvez utiliser root.grid_rowconfigure et root.grid_columnconfigure pour définir les valeurs de minsize comme suit:

from tkinter import Frame, Tk

class MyApp():
    def __init__(self):
        self.root = Tk()

        self.my_frame_red = Frame(self.root, bg='red')
        self.my_frame_red.grid(row=0, column=0, sticky='nsew')

        self.my_frame_blue = Frame(self.root, bg='blue')
        self.my_frame_blue.grid(row=0, column=1, sticky='nsew')

        self.root.grid_rowconfigure(0, minsize=200, weight=1)
        self.root.grid_columnconfigure(0, minsize=200, weight=1)
        self.root.grid_columnconfigure(1, weight=1)

        self.root.mainloop()

if __name__ == '__main__':
    app = MyApp()

Mais comme Brian l'a écrit (en 2010: D), vous pouvez toujours redimensionner la fenêtre pour qu'elle soit plus petite que le cadre si vous ne limitez pas sa taille.

0
Richard