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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4399180/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 15:34:25  来源:igfitidea点击:

How to set the min and max height or width of a Frame?

pythonuser-interfacetkinterttk

提问by Malcolm

The size of Tkinter windows can be controlled via the following methods:

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

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

Are there equivalent ways to control the size of Tkinter or ttk Frames?

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

@Bryan: I changed your frame1.pack code to the following:

@Bryan:我将您的 frame1.pack 代码更改为以下内容:

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

And I added this event handler:

我添加了这个事件处理程序:

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

The above event handler detects that a frame's width is too big, but is unable to prevent the increase in size from happening. Is this a limitation of Tkinter or have I misunderstood your explanation?

上述事件处理程序检测到帧的宽度太大,但无法阻止尺寸增加的发生。这是 Tkinter 的限制还是我误解了您的解释?

采纳答案by Bryan Oakley

There is no single magic function to force a frame to a minimum or fixed size. However, you can certainly force the size of a frame by giving the frame a width and height. You then have to do potentially two more things: when you put this window in a container you need to make sure the geometry manager doesn't shrink or expand the window. Two, if the frame is a container for other widget, turn grid or pack propagation off so that the frame doesn't shrink or expand to fit its own contents.

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

Note, however, that this won't prevent you from resizing a window to be smaller than an internal frame. In that case the frame will just be clipped.

但是请注意,这不会阻止您将窗口大小调整为小于内部框架。在这种情况下,框架将被剪裁。

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

回答by Richard

A workaround - at least for the minimum size: You can use grid to manage the frames contained in root and make them follow the grid size by setting sticky='nsew'. Then you can use root.grid_rowconfigure and root.grid_columnconfigure to set values for minsize like so:

解决方法 - 至少对于最小尺寸:您可以使用 grid 来管理包含在 root 中的框架,并通过设置 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()

But as Brian wrote (in 2010 :D) you can still resize the window to be smaller than the frame if you don't limit its minsize.

但是正如 Brian 所写(在 2010 年:D),如果您不限制其最小尺寸,您仍然可以将窗口的大小调整为小于框架。