Python Tkinter框架布局、权重和大小调整,网格几何体管理器

Python Tkinter框架布局、权重和大小调整,网格几何体管理器,python,tkinter,tkinter-layout,Python,Tkinter,Tkinter Layout,我想我对网格的工作方式不太了解 我的问题似乎与这个问题有关: 答案是需要使用函数grid\u columnconfigure()和grid\u rowconfigure()为一个项目赋予权重,以便它占用额外的空间 下面是一个简单示例的代码。 我试图实现的是能够指定frame0的大小,将其粘贴到根窗口的所有侧面,然后将子框架frame1粘贴到左、上、右的frame0,并在调整应用程序主窗口的大小时进行拉伸/收缩 因此,最初,我希望应用程序基本上以500x350的大小发布frame1将与自然状态一

我想我对网格的工作方式不太了解

我的问题似乎与这个问题有关:

答案是需要使用函数
grid\u columnconfigure()
grid\u rowconfigure()
为一个项目赋予权重,以便它占用额外的空间

下面是一个简单示例的代码。 我试图实现的是能够指定
frame0
的大小,将其粘贴到根窗口的所有侧面,然后将子框架
frame1
粘贴到左、上、右的
frame0
,并在调整应用程序主窗口的大小时进行拉伸/收缩

因此,最初,我希望应用程序基本上以500x350的大小发布
frame1
将与自然状态一样高,基本上是500像素宽(减去一点填充)

在acw1668的评论之后,我更新了代码以配置
root
,并将其权重设置为1。正如我所希望的那样,入口的大小现在可以改变以占据任何水平空间。但是GUI仍然以“自然”大小启动,尽管我已经为
frame0
指定了一个显式大小。我不明白为什么几何体管理器不将500x350视为自然尺寸并进行分配

有人能看到如何使首次发布的规模达到预期吗

#!/usr/bin/env python3

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Layout Problem")
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

frame0 = ttk.Frame(root, padding=4, width=500, height=350)
frame0.grid_columnconfigure(0, weight=1)
frame0.grid_rowconfigure(0, weight=1)
frame0.grid(column=0, row=0, sticky=(W, N, E, S))

frame1 = ttk.Frame(frame0, padding=4)
frame1.grid_columnconfigure(1, weight=1)
frame1['borderwidth'] = 2
frame1['relief'] = "ridge"
frame1.grid(column=0, row=0, sticky=(W, N, E))

# add widgets to 'frame1'
ttk.Label(frame1, text="Label: ").grid(row=0, column=0, sticky=W)

entryValue = StringVar()
ttk.Entry(frame1, textvariable=entryValue)\
    .grid(row=0, column=1, sticky=(W, E))
entryValue.set("Entry")

ttk.Button(frame1, text="Button")\
    .grid(row=0, column=2, sticky=E)

root.mainloop()

以下是纳入acw1668建议后的代码,以供参考

GUI现在以预期大小启动。第二个问题是,现在帧的宽度没有缩小到500 px以下(即,条目不会收缩回自然大小),尽管您可以强制应用程序窗口变小。这是另一个问题

我可以看出,整个布局和业务调整都有一些微妙之处,我还有一段路要走

希望这个问题对遵循同样思路的其他人有一定的教学价值:

#!/usr/bin/env python3

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Layout Problem")
root.grid_columnconfigure(0, weight=1, minsize=500)
root.grid_rowconfigure(0, weight=1, minsize=350)

frame0 = ttk.Frame(root, padding=4)
frame0.grid(column=0, row=0, sticky=(W, N, E, S))
frame0.grid_columnconfigure(0, weight=1)
frame0.grid_rowconfigure(0, weight=1)

frame1 = ttk.Frame(frame0, padding=4)
frame1.grid_columnconfigure(1, weight=1)
frame1['borderwidth'] = 2
frame1['relief'] = "ridge"
frame1.grid(column=0, row=0, sticky=(W, N, E))

# add widgets to 'frame1'
ttk.Label(frame1, text="Label: ").grid(row=0, column=0, sticky=W)

entryValue = StringVar()
ttk.Entry(frame1, textvariable=entryValue)\
    .grid(row=0, column=1, sticky=(W, E))
entryValue.set("Entry")

ttk.Button(frame1, text="Button")\
    .grid(row=0, column=2, sticky=E)

root.mainloop()

第一个链接没有链接到问题,而是链接到搜索结果。不清楚你在谈论哪个问题。您可以从标签列表下方的
share
链接获得实际问题的链接。为什么要将框架强制为特定大小?这很不寻常。另外,您只使用
网格
有什么原因吗?对于您试图实现的布局,似乎
pack
可能是更好的解决方案。请注意,应在父容器上应用
grid\u rowconfigure()
grid\u columnconfigure()
,以控制其子容器的布局。因此,您应该调用
root.grid\u rowconfigure()
root.grid\u columnconfigure()
来控制
frame0
。同样,您应该调用
frame0.grid\u columnconfigure()
来控制
frame1
。布莱恩,感谢您的回复。我更新了链接指向正确的答案-我的错,谢谢你指出这一点。至于我为什么要做我想做的事,我是一个爱学习的人。马克·罗斯曼(Mark Roseman)在《忙碌的Python开发人员的现代Tkinter示例》中给出了以下示例:他建议用网格做所有事情。然后你需要使用
root.Grid\u columnconfigure(0,weight=1,minsize=500)
root.Grid\u rowconfigure(0,weight=1,minsize=350)
。另一个选项是调用
frame0.grid\u propagate(0)
,删除两个
minsize
选项,并在创建
frame0
时添加回
width=500,height=350