Как предотвратить уменьшение виджета до размера его содержимого?

#python #python-3.x #tkinter

Вопрос:

В коде, который я пишу, я создаю несколько фреймов и размещаю их на месте, как в примере. Рамка иерархии имеет заданную ширину 260. Когда я помещаю этикетку шириной меньше ширины рамки, ширина рамки уменьшается до ширины этикетки.

Код приведен ниже:

 from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Application")
root.geometry("1200x1000")

s=ttk.Style()
s.configure('TFrame', background='gray')
s.configure('windowframes.TFrame', background='darkgray')

mainframe = ttk.Frame(root, padding="2 2 2 2",height=300)
mainframe.grid(column=0, row=0, sticky=(N,E,S,W))

toolframe = ttk.Frame(mainframe,height=60,style='windowframes.TFrame')
toolframe.grid(column=0, row=0, columnspan=2,sticky=(N,S,E,W), padx=2, pady=2)

hierarchyframe = ttk.Frame(mainframe,width=260,style='windowframes.TFrame')
hierarchyframe.grid(column=0, row=1, rowspan=2, sticky=(N,S,E,W), padx=2, pady=2)
label = Label(hierarchyframe,text="sample")
label.grid(column=0, row=0)

graphicframe = ttk.Frame(mainframe,style='windowframes.TFrame')
graphicframe.grid(column=1, row=1, sticky=(N,S,E,W), padx=2, pady=2)

fileframe = ttk.Frame(mainframe,height=360,style='windowframes.TFrame')
fileframe.grid(column=1, row=2, sticky=(N,S,E,W), padx=2, pady=2)

mainframe.columnconfigure(1,weight=1)
mainframe.rowconfigure(1,weight=1)

root.columnconfigure(0,weight=1)
root.rowconfigure(0,weight=1)

root.mainloop()
 

Стили есть, поэтому вы можете видеть контуры рамок.

Ответ №1:

Вы можете исправить то, что вам нужно сказать Frame , чтобы он не распространял свои размеры, то есть не подстраивался под свое содержимое. Вы можете предотвратить это, используя grid_propagate() метод, показанный ниже:

 ...
toolframe = ttk.Frame(mainframe,height=60,style='windowframes.TFrame')
toolframe.grid(column=0, row=0, columnspan=2,sticky=(N,S,E,W), padx=2, pady=2)
hierarchyframe = ttk.Frame(mainframe,width=260,style='windowframes.TFrame')
hierarchyframe.grid(column=0, row=1, rowspan=2, sticky=(N,S,E,W), padx=2, pady=2)
hierarchyframe.grid_propagate(False)  # <=== ADDED ====
label = Label(hierarchyframe,text="sample")
...
 

Вот скриншот, показывающий результат:

скриншот

Другой альтернативой было бы использовать установку минимального размера столбца в пикселях, как показано ниже, что не помешало бы ему расширяться:

 hierarchyframe.columnconfigure(0, minsize=260)