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

38 投票
3 回答
175893 浏览
提问于 2025-04-16 08:17

我们可以通过以下方法来控制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的限制,还是我对你的解释理解错了呢?

3 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

8

有一个解决办法——至少对于最小尺寸来说:你可以使用网格布局来管理根窗口中的框架,并通过设置sticky='nsew'让它们跟随网格的大小。然后,你可以使用root.grid_rowconfigure和root.grid_columnconfigure来设置最小尺寸的值,像这样:

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,如果你不限制最小尺寸,窗口还是可以调整得比框架小。

39

没有一种神奇的函数可以强制一个框架(窗口)保持最小或固定的大小。不过,你可以通过给这个框架设置宽度和高度来强制它的大小。接下来,你可能还需要做两件事:第一,当你把这个窗口放进一个容器时,要确保几何管理器(负责布局的部分)不会让这个窗口变小或变大。第二,如果这个框架是用来放其他小部件的,要关闭网格或打包的传播功能,这样框架就不会因为里面的内容而变小或变大。

不过要注意,这样做并不能阻止你把窗口调整得比内部框架还小。在这种情况下,框架的内容会被裁剪掉。

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

撰写回答