繁体   English   中英

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

[英]Python Tkinter Frame layout, weight, and resizing, Grid geometry manager

我想我不了解 Grid 的工作方式......

我的问题似乎与这个 SO 问题有关: Python tkinter Text widget fill fixed sized frame using grid

答案是需要使用函数grid_columnconfigure()grid_rowconfigure()为项目赋予权重以使其占用额外空间。

下面是一个简单示例的代码。 我想要实现的是能够指定frame0的大小,让它粘在根 window 的所有边上,然后让子框架frame1粘在frame0的左、上、右和到调整应用程序的主要 window 大小时拉伸/收缩。

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

在 acw1668 的评论之后,我更新了代码以配置root并将其权重设置为 1。Entry 的大小现在可以根据我的需要改变以占据任何水平空间。 但是 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 像素宽度以下(即,条目不会折叠回自然大小),但您可以强制应用程序 window 变小。 这是一个单独的问题。

我可以看到整个布局和调整业务大小有一些微妙之处,我还有办法到达 go。;)

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

#!/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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM