簡體   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