Python学习,第七课(灵活使用Frame,让布局更舒适)

本文介绍了如何使用Python的Tkinter库进行GUI界面布局的优化,通过灵活运用Frame进行元素组织,详细讲解了布局基础知识、尝试布局的过程、布局的实际应用以及细节优化,包括设置wraplength和justify参数解决Label换行问题,最终将程序打包成exe文件。
摘要由CSDN通过智能技术生成

一入布局深似海,加一减一都很难

上一课,我们最终实现了这个软件的界面显示和控制功能。
在这里插入图片描述
看起来,我们是实现了功能,但是有点乱七八糟的。
其实Python除了自己的tkinter库以外,还有QtPy等多种其他库,都可以实现界面显示。
相比Qtpy图形拖拽式的制作界面,tkinter好像显得不那么友好。
不过,对于我们这个结构简单的程序来说,也没啥难的。

基础知识

首先,我们在上一课中使用了label、scale、button等元素,同时吧这些元素都放进了main的frame框架中。
这节课,我们要尝试灵活使用frame框架,为我们的程序实现布局优化。因此,几个必须了解的知识点要熟悉。

  1. 元素部署在哪个框架中,整体位置随着框架移动
  2. 当元素体积大于框架时,框架会随着元素增大
  3. 框架在使用pack方法打包时,可以设置“top、left、right、bottom”四种排列效果
  4. 除了pack方法,还可以使用grid、place,每种方法都有相应的参数用来确定呈现位置,需要仔细尝试

尝试布局

首先,我们新建一个py,尝试一下布局。
由于过程比较坎坷,所以很多尝试过程没法复原。

from tkinter import *

root = Tk()
root.geometry("800x500+400+400")

top = Frame(root,height=100, width=800, bd=5, highlightthickness=1)
left = Frame(root,height=200, width=199, bd=5, highlightthickness=1)
right = Frame(root,height=200, width=599, bd=5, highlightthickness=1)
foot = Frame(root,height=100, width=800, bd=5, highlightthickness=1)

toplabel = Label(top, text="这里是top", font=("宋体", 16, "bold"), bd="2", bg="YELLOW", height=3, width=100)
leftlabel = Label(left, text="这里是left", font=("宋体", 16, "bold"), bd="2", bg="red", height=20, width=20)
rightlabel = Label(right, text="这里是right", font=("宋体", 16, "bold"),bd="2", bg="green", height=15, width=70)
footlabel = Label(foot, text="这里是foot", font=("宋体", 16, "bold"), bd="2", bg="blue", height=3, width=100)

toplabel.pack()
leftlabel.pack()
rightlabel.pack()
footlabel.pack()

top.pack(side='top')
left.pack(side='left')
right.pack()
foot.pack()

root.mainloop()

可以明确的是,我们在新建窗口时候输入的信息,是指代像素px
但是在label里的宽高,并不指像素,仔细读代码可以看到,上面程序里label里的宽、高,都不是依照像素的大小限定的,如果你要尝试其他布局,要小心这里。
运行结果如下:
在这里插入图片描述

尝试好布局,感受下元素带来的不同

这里我们得到了一个不错的布局方案,下面我们把主程序使用的元素带入现在布局中,尝试一下。

from tkinter import *

root = Tk()
root.geometry("800x300+400+400")
root.title("双色球小程序")
v = StringVar()

top = Frame(root, height=100, width=800, bd=5, highlightthickness=1, relief="flat")
Ltitle = Label(top, text="上一期()开奖结果: ", font=("宋体", 16, "bold"), width=100, bd="2", anchor="w")
LRed =  Label(top, text="红球:", font=("宋体", 12, "bold"), width=100, bd="2", fg="RED", anchor="w")
LBlue = Label(top, text="蓝球:", font=("宋体", 12, "bold"), width=100, bd="2", fg="BLUE", anchor="w")

left = Frame(root,height=200, width=199, bd=5, highlightthickness=1, relief="raised")
LAnswer = Label(left, textvariable = v, font=("宋体", 12, "bold"), bd="2", height=15, width=20)
v.set("恭喜發財!")

right = Frame(root,height=200, width=599, bd=5, highlightthickness=1, relief="ridge")
slred = Scale(right, from_=6, to=33, orient="horizontal", tickinterval=1, length=580, label="红球", font=("宋体", 10, "bold"), fg="RED", sliderlength="10", sliderrelief="flat", width="5")
slblue = Scale(right, from_=1, to=16, orient="horizontal", tickinterval=1, length=580, label="蓝球", font=("宋体", 10, "bold"),  fg="BLUE", sliderlength="10", sliderrelief="flat", width="5")

foot = Frame(root,height=100, width=800, bd=5, highlightthickness=1)
b1 = Button(foot, text ="  生成  ", width=20)

Ltitle.pack()
LRed.pack()
LBlue.pack()

slred.pack()
slblue.pack()
LAnswer.pack
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红辣椒炒绿辣椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值