Как предотвратить изменение размера кадра tkinter в наборе кадров - PullRequest
0 голосов
/ 29 ноября 2018

Для приложения моделирования я создаю пользовательский интерфейс с модулем Tkinter на python.В настоящее время я пытаюсь добавить ограничения на фреймы и размер окна, чтобы сохранить хороший интерфейс независимо от размера окна.

В части моего пользовательского интерфейса у меня есть что-то вроде этого:

from tkinter import *

root = Tk()

topframe=       Frame(master=root,bg='red')
midframe=       Frame(master=root,bg='blue')
bottomframe=    Frame(master=root,bg='yellow')

toplabel=       Label(master=topframe,bg='red',text='Must be non resizable unless window cannot fit it \n (Contains buttons)',height=10)
midlabel=       Label(master=midframe,bg='blue',text='Must be resizable \n (Contains a graph)',height=10)
bottomlabel=    Label(master=bottomframe,bg='yellow',text='Must be non resizable unless window cannot fit it \n (Contains simulation results)',height=10)

toplabel.pack(fill=X,expand=TRUE)
midlabel.pack(fill=X,expand=TRUE)
bottomlabel.pack(fill=X,expand=TRUE)

topframe.pack(side=TOP,fill=BOTH,expand=FALSE)
midframe.pack(side=TOP,fill=BOTH,expand=TRUE)
bottomframe.pack(side=TOP,fill=BOTH,expand=FALSE)

root.mainloop()

Таким образом, я получаю и окно, как это:

Окно, которое я получаю

Но моя проблема заключается в том, как я изменяю размер окна, чтобы уменьшить, желтыйдетали сжимаются до тех пор, пока они не исчезнут, но я бы хотел, чтобы размер был фиксированным, а синяя часть уменьшалась (рамка посередине).У кого-нибудь есть идея сделать это?

Я уже пробовал grid_propagate (False) и уже наблюдал связанные вопросы, но либо он не имеет никаких эффектов, либо не соответствует моему примеру.Спасибо за вашу помощь

1 Ответ

0 голосов
/ 29 ноября 2018

Используя grid() вместо pack(), это можно сделать, как показано ниже:

from tkinter import *

root = Tk()

topframe = Frame(root, bg='red')
midframe = Frame(root, bg='blue')
bottomframe = Frame(root, bg='yellow')

root.rowconfigure([0,2], minsize=90)    # Set min size for top and bottom
root.rowconfigure(1, weight=1)          # Row 1 should adjust to window size
root.columnconfigure(0, weight=1)       # Column 0 should adjust to window size
topframe.grid(row=0, column=0, sticky='nsew')   # sticky='nsew' => let frame 
midframe.grid(row=1, column=0, sticky='nsew')   # fill available space
bottomframe.grid(row=2, column=0, sticky='nsew')

toplabel = Label(topframe, bg='red', text='Must be non resizable unless window cannot fit it \n (Contains buttons)',height=10)
midlabel = Label(midframe, bg='blue', text='Must be resizable \n (Contains a graph)',height=10)
bottomlabel = Label(bottomframe, bg='yellow', text='Must be non resizable unless window cannot fit it \n (Contains simulation results)',height=10)

toplabel.pack(fill=X,expand=TRUE)
midlabel.pack(fill=X,expand=TRUE)
bottomlabel.pack(fill=X,expand=TRUE)

root.mainloop()

Возможно, вы также захотите установить минимальный размер окна.

...