python gui框架_python – 使用框架和网格的tkinter gui布局

I assumed that frames contain their own ‘grid space’

这是一个正确的假设.

You can just see one of the entry fields to the right of the green

frame. Why is it going there ?

问题从这里开始:

top_frame = Frame(root, ...).grid(row=0, ...)

在python中,x = y().z()将始终将x设置为.z()的结果.在top_frame = Frame(…).grid(…)的情况下,grid(…)始终返回None,因此top_frame将为None.这会导致您认为进入顶部框架的每个窗口小部件实际进入根窗口.

方案概述

作为一般经验法则,您不应该将网格,包装或放置作为创建窗口小部件的同一语句的一部分.部分原因是您遇到的这种确切行为,但也因为我认为这会使您的代码更难以编写,并且随着时间的推移难以维护.

窗口小部件创建和窗口小部件布局是两回事.根据我的经验,当您将布局命令组合在一起时,布局问题更容易调试.

此外,在使用网格时应保持一致,并始终以相同的顺序放置选项,以便您可以更轻松地显示布局.最后,当使用网格时,你应该养成总是指定粘性选项的习惯,并且总是在每个包含框架中给出一行和一列非零权重.

解决方案示例

这是我编写代码的方式.它更长,但更容易理解.

from Tkinter import *

root = Tk()

root.title('Model Definition')

root.geometry('{}x{}'.format(460, 350))

# create all of the main containers

top_frame = Frame(root, bg='cyan', width=450, height=50, pady=3)

center = Frame(root, bg='gray2', width=50, height=40, padx=3, pady=3)

btm_frame = Frame(root, bg='white', width=450, height=45, pady=3)

btm_frame2 = Frame(root, bg='lavender', width=450, height=60, pady=3)

# layout all of the main containers

root.grid_rowconfigure(1, weight=1)

root.grid_columnconfigure(0, weight=1)

top_frame.grid(row=0, sticky="ew")

center.grid(row=1, sticky="nsew")

btm_frame.grid(row=3, sticky="ew")

btm_frame2.grid(row=4, sticky="ew")

# create the widgets for the top frame

model_label = Label(top_frame, text='Model Dimensions')

width_label = Label(top_frame, text='Width:')

length_label = Label(top_frame, text='Length:')

entry_W = Entry(top_frame, background="pink")

entry_L = Entry(top_frame, background="orange")

# layout the widgets in the top frame

model_label.grid(row=0, columnspan=3)

width_label.grid(row=1, column=0)

length_label.grid(row=1, column=2)

entry_W.grid(row=1, column=1)

entry_L.grid(row=1, column=3)

# create the center widgets

center.grid_rowconfigure(0, weight=1)

center.grid_columnconfigure(1, weight=1)

ctr_left = Frame(center, bg='blue', width=100, height=190)

ctr_mid = Frame(center, bg='yellow', width=250, height=190, padx=3, pady=3)

ctr_right = Frame(center, bg='green', width=100, height=190, padx=3, pady=3)

ctr_left.grid(row=0, column=0, sticky="ns")

ctr_mid.grid(row=0, column=1, sticky="nsew")

ctr_right.grid(row=0, column=2, sticky="ns")

root.mainloop()

结果:

Ht4Ck.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值