如何在tkinter中将初始窗口大小设置为最小窗口大小?

31

我理解的是,在__init__方法中初始化所有框架和小部件后,tkinter窗口会自动调整大小以适应这些组件。

我想将窗口的初始化大小设置为其最小大小。我希望能够将窗口最大化并缩放更大,但我永远不希望窗口变得足够小以开始隐藏小部件。

如何实现这个目标?


你是想限制用户不让他缩小窗口大小吗?你的窗口里是否有太多的小部件而导致一些被裁剪掉了,还是因为布局问题导致一些小部件被错误地裁剪掉了(例如:滚动条消失而不是文本小部件缩小)? - Bryan Oakley
4个回答

58

您也可以通过使用以下方式之一,立即强制进行更新而无需进入主循环:

root = Tk()
# set up widgets here, do your grid/pack/place
# root.geometry() will return '1x1+0+0' here
root.update()
# now root.geometry() returns valid size/placement
root.minsize(root.winfo_width(), root.winfo_height())

update() 方法会处理所有待处理的事件,调用事件回调函数,完成任何挂起的几何管理,必要时重新绘制小部件,并调用所有待处理的空闲任务。由于可能从错误的位置调用此方法(例如,在事件回调或可以从事件回调中调用的函数中调用),因此应谨慎使用此方法,以免导致严重的竞态条件。如有疑问,请改用 update_idletasks。

在尝试弄清楚如何在进入主循环之前获取小部件的大小/位置等操作时,我经常使用此方法。


1
这比我的答案干净多了。谢谢! - Jace Browning

28

我知道这个问题很老,不过还有一种方法:

root = Tk()
root.minsize(foo, bar)

root.minsize()设置窗口的最小大小为 foobar,其中foobar分别是窗口的宽度和高度。

但是您必须在主循环完成之前运行此代码。该命令只有在调用后才会生效。


1
你不一定非得在主循环之前放置那段代码,这并不是绝对的。 - double_j

4
我已经理解了:
def __init__(self, master):
    ...
    self.master.update_idletasks()
    self.master.after_idle(lambda: self.master.minsize(self.master.winfo_width(), self.master.winfo_height()))

-6
root = Tk()

自从根窗口被创建以来,根窗口就是我们程序中的主应用程序窗口。它有一个标题栏和边框,这些都由窗口管理器提供。在创建任何其他小部件之前必须先创建它。
root.geometry("250x150+300+300")

geometry() 方法设置窗口的大小并将其定位在屏幕上。前两个参数是窗口的宽度和高度。最后两个参数是 x、y 屏幕坐标。

app = Example(root)

在这里,我们创建应用程序类的实例。

root.mainloop()  

最后,我们进入主循环。事件处理从这里开始。主循环接收来自窗口系统的事件,并将它们分派给应用程序小部件。当我们单击标题栏的关闭按钮或调用quit()方法时,它将终止。

enter image description here

希望你觉得这个有用。


3
你的回答似乎完全没有回答问题。你的回答和设置窗口最小尺寸有什么关系? - Bryan Oakley
没有单一的魔法函数可以强制帧的最小或固定大小。但是,您可以通过为帧设置宽度和高度来强制帧的大小。 - miksiii
2
@miksiii 这个“Magic”函数就是其他答案所提供的。它甚至不能防止用户以任何方式调整大小,也不能防止小部件被隐藏,正如OP所要求的那样。 - Artemis

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