[英]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.