如何设置框架的最小和最大高度或宽度?

36

可以通过以下方法控制Tkinter窗口的大小:

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

是否有控制Tkinter或ttk框架大小的等效方法?

@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的限制还是我误解了你的说明?


2
我觉得你误解了。我的解释是指出,如果你使用expand设置为False和fill设置为None进行打包,那么框架将具有静态宽度,不会增长或缩小。如果框架因其父级而改变大小,则在框架上设置pack_propagate无效,你需要在父级上设置它。pack_propagate仅设置框架是否根据其内容更改大小,而不是根据其父级。 - Bryan Oakley
3个回答

37

没有单一的神奇函数可以强制帧的最小或固定大小。但是,您可以通过指定框架的宽度和高度来强制设置框架的大小。然后,您可能需要做两件事情:当您将此窗口放入容器时,您需要确保几何管理器不会缩小或扩展窗口。如果该帧是其他小部件的容器,则需要关闭网格或包装传播,以使帧不会缩小或扩展以适应其自身内容。

但请注意,这并不能防止您将窗口调整为小于内部帧的大小。在这种情况下,帧将被裁剪。

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

7

一种解决办法-至少对于最小尺寸而言:您可以使用网格来管理包含在根中的框架,并通过设置sticky ='nsew'使它们遵循网格大小。然后,您可以使用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()

但正如 Brian(2010 年时)所写的那样,如果您不限制最小大小,仍然可以调整窗口大小为小于框架大小。


2
最大尺寸在哪里?我需要最大尺寸而不是最小尺寸。 - greendino

1
# this code works for me

import tkinter as tk


class tk(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.pack()


window = tk()
window.master.title("window")
window.master.minsize(100, 100)
window.master.maxsize(300, 300)
window.mainloop()

那是10年前的事了。因此,您正在使用Python 3,但无法在Python 2上运行。所以您不必担心回顾10年前的事情。 - toyota Supra
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接