Как установить минимальную и максимальную высоту или ширину фрейма?

Размер окон Tkinter можно контролировать с помощью следующих методов:

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

Существуют ли эквивалентные способы управления размером Tkinter или ttk Frames?

@Bryan: я изменил ваш код frame1.pack на следующий:

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

И я добавил этот обработчик событий:

# 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'

Приведенный выше обработчик событий обнаруживает, что ширина фрейма слишком велика, но не может предотвратить увеличение размера. Это ограничение Tkinter или я неправильно понял ваше объяснение?


person Malcolm    schedule 09.12.2010    source источник
comment
Я думаю, вы неправильно поняли. В моем объяснении указывалось, что если вы упаковываете с расширением, установленным на False, и для заполнения, установленным на None, рамка будет иметь статическую ширину и не будет увеличиваться или уменьшаться. Если фрейм меняет размер из-за своего родителя, установка pack_propagate для фрейма не имеет никакого эффекта, вам нужно установить его для родителя. pack_propagate только устанавливает, будет ли размер фрейма изменяться в зависимости от его содержимого, а не в зависимости от его родителя.   -  person Bryan Oakley    schedule 09.12.2010
comment
@Bryan: Спасибо за продолжение. Теперь я понимаю.   -  person Malcolm    schedule 11.12.2010


Ответы (2)


Не существует единой волшебной функции, позволяющей установить минимальный или фиксированный размер кадра. Однако вы, безусловно, можете увеличить размер кадра, задав ему ширину и высоту. Затем вам, возможно, придется сделать еще две вещи: когда вы помещаете это окно в контейнер, вам нужно убедиться, что менеджер геометрии не сжимает и не расширяет окно. Во-вторых, если фрейм является контейнером для другого виджета, отключите распространение сетки или пакета, чтобы фрейм не сжимался и не расширялся, чтобы соответствовать своему собственному содержимому.

Обратите внимание, однако, что это не помешает вам изменить размер окна, чтобы он был меньше внутреннего фрейма. В этом случае кадр будет просто обрезан.

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()
person Bryan Oakley    schedule 09.12.2010
comment
Спасибо за объяснение и пример кода. Я изменил ваш код и обновил свой вопрос. - person Malcolm; 09.12.2010

Обходной путь — по крайней мере, для минимального размера: вы можете использовать сетку для управления фреймами, содержащимися в корне, и заставить их следовать размеру сетки, установив sticky='new'. Затем вы можете использовать root.grid_rowconfigure и root.grid_columnconfigure, чтобы установить значения для minsize следующим образом:

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()

Но, как писал Брайан (в 2010 году: D), вы все равно можете изменить размер окна, чтобы оно было меньше фрейма, если вы не ограничиваете его минимальный размер.

person Richard    schedule 09.01.2020
comment
где максимальный размер? мне нужен максимальный размер, а не минимальный - person Foggy Minded Greenhorn; 01.05.2020