以下内容为自己的学习笔记,如需求转载,请声明原文链接 微信大众号「ENG八戒」mp.weixin.qq.com/s/B1hH5Qzd2…
本文大约 2874 个字,阅读需花 10 分钟
内容不多,但也花了一些精力
如要沟通,欢迎重视我然后评论区留言
谢谢你的点赞收藏共享
进入正文之前先说一件小事,本大众号已改名为【ENG八戒】,原名是【englyf】。改名的理由是什么?以后会告知朋友们的!
别的文末有福利彩蛋,毕竟今天是元宵节!
这篇文章归于系列文章《Python 内置界面开发结构 Tkinter入门篇》的第三篇,上接《Python 内置界面开发结构 Tkinter入门篇乙》,欢迎重视我的微信大众号「ENG八戒」查看这个系列相关文章。
界面布局
关于 Tkinter 结构的 GUI 布局,其实官方没有提供对应的图形化工具可用,可是网上有一些开源的小工具能够运用。这儿不计划介绍这些小工具的运用,而是直接用结构提供的几何图形管理器来布局,比方上面提到过的 pack() 便是其中一种。这儿提到的几何图形管理器也便是其它结构里常说的布局管理器。
Tkinter 结构提供的布局管理器有:pack、grid、place 三种。每一个控件只能够运用一种布局管理器,不同控件运用的布局管理器能够不一样。
pack
形象点说, pack 便是把控件包装在一个矩形区域,这个区域巨细足够放置控件,而且默许置中。pack 是最简略的布局管理器,也称之为包装布局。
直接试一试用 pack 来布局三个静态标签 Label,默许设置(pack() 传入参数为空)
import tkinter as tk
window = tk.Tk()
lbl_1 = tk.Label(
master=window,
text="label 1",
fg="black",
bg="red",
width=10,
height=5
)
lbl_1.pack()
lbl_2 = tk.Label(
master=window,
text="label 2",
fg="black",
bg="yellow",
width=10,
height=5
)
lbl_2.pack()
lbl_3 = tk.Label(
master=window,
text="label 3",
fg="black",
bg="blue",
width=10,
height=5
)
lbl_3.pack()
window.mainloop()
看看显现作用
能够看到,默许 pack 会在父窗口 window 中垂直方向按顺序包装摆放这三个静态标签 Label。
那么,假如我需求让这几个标签水平摆放呢?能够这姿态改
lbl_1.pack(side=tk.LEFT)
...
lbl_2.pack(side=tk.LEFT)
...
lbl_3.pack(side=tk.LEFT)
看看显现作用
pack(side=tk.TOP) 和默许设置等价。
简略汇总介绍一下其它的参数
参数 | 赋值 | 阐明 |
---|---|---|
after | 控件 widget | 将此控件包装在控件 widget 后边 |
anchor | NSEW (or subset) | 依据方向定位此控件,NSEW 表示北南东西四个方向 |
before | 控件 widget | 将此控件包装在控件 widget 前边 |
expand | bool 类型值 | 跟着父控件一同弹性 |
fill | NONE、X、Y、BOTH | 选择当控件弹性时按照哪个方向填充 |
ipadx | amount | 在x方向增加内部填充 |
ipady | amount | 在y方向增加内部填充 |
padx | amount | 在x方向增加填充 |
pady | amount | 在y方向增加填充 |
side | TOP、BOTTOM、LEFT、RIGHT | 把控件往哪边增加 |
很多时分开发界面都需求让里边的控件跟从窗口主动拉伸巨细,来看一下上面的代码应该怎样改
lbl_1.pack(fill=tk.BOTH, expand=tk.TRUE)
...
lbl_2.pack(fill=tk.BOTH, expand=tk.TRUE)
...
lbl_3.pack(fill=tk.BOTH, expand=tk.TRUE)
发动的时分,还没有拉伸窗口
然后拉伸看看
grid
如名字表述,grid 会把父窗口区分成队伍,然后依据调用时传入参数 row,column 确认把控件放置在对应的队伍中。grid 也称之为格子布局。
还是以静态标签为例,创建 3×3 的矩阵标签。为了凸显各个标签的鸿沟,这儿还需求增加 Frame 控件,每个标签放置于单独的 Frame 中。
import tkinter as tk
window = tk.Tk()
for i in range(3):
for j in range(3):
frame = tk.Frame(
master=window,
relief=tk.RAISED,
borderwidth=1
)
frame.grid(row=i, column=j)
label = tk.Label(
master=frame,
text=f"Row {i}\nColumn {j}"
)
label.pack()
window.mainloop()
能够看到,上面这个比方布局时,只有 Frame 才需求运用 grid 管理器,因为每个标签和 Frame 一一对应,所以标签不需求重复运用格子布局。
看看显现作用
简略汇总介绍一下其它的参数
参数 | 赋值 | 阐明 |
---|---|---|
column | 列序号 | 指定放置的列,从0开端 |
columnspan | 列数 | 放置的控件横跨多少列 |
ipadx | amount | 在 x 方向增加内部填充 |
ipady | amount | 在 y 方向增加内部填充 |
padx | amount | 在 x 方向增加外部填充 |
pady | amount | 在 y 方向增加外部填充 |
row | 行序号 | 指定放置的行,从0开端 |
rowspan | number | 放置的控件横跨多少行 |
sticky | NSEW | 假如单元格比较大,那么控件的指定鸿沟将贴着单元格。NSEW别离对应顶部、底部、右边、左边鸿沟 |
仔细的朋友会发现,一旦拉伸上面的那个矩阵标签窗口,窗口界面就会露出部分底面,矩阵标签没有跟从一同拉伸。
这样明显和我们的预期不符合,这个问题怎样解决呢?
能够调用父窗口的 columnconfigure() 和 rowconfigure() 办法装备各列和行的弹性比。这两个办法都有三个输入参数,看下面的表格
参数 | 阐明 |
---|---|
index | 序号,指定特定的行或列,能够是单个队伍序号值,也能够是代表多个行或列的列表 |
weight | 弹性权重 |
minsize | 最小宽度值 |
现在来看看怎样改,才能让矩阵标签跟从父窗口一同拉伸?
import tkinter as tk
window = tk.Tk()
for i in range(3):
window.rowconfigure(i, weight=1)
window.columnconfigure(i, weight=1)
for j in range(3):
frame = tk.Frame(
master=window,
relief=tk.RAISED,
borderwidth=1
)
frame.grid(row=i, column=j)
label = tk.Label(
master=frame,
text=f"Row {i}\nColumn {j}"
)
label.pack()
window.mainloop()
看看拉伸之后的显现作用
perfect!别的需求提一下,grid 具有 pack 能做的所有功能,可是运用的形式更简略,因而应该作为更优先的布局管理器。
place
place 用于对控件准确认位的场合。运用的时分需求传入参数 x 和 y 别离用于指定控件的放置位置坐标值 x 和 y,传入的 x 和 y 是基于父控件的左上角为原点的坐标系,单位是像素点。
大多数界面运用里,控件都不需求准确的定位。可是某些,比方地图运用里,就的确需求对元素的准确认位了。
下面举个栗子,在窗口里不同位置放置各一个标签
import tkinter as tk
window = tk.Tk()
label1 = tk.Label(
master=window,
text="place (0, 0)",
bg="yellow"
)
label1.place(x=0, y=0)
label2 = tk.Label(
master=window,
text="place (40, 40)",
bg="blue"
)
label2.place(x=40, y=40)
window.mainloop()
看看上面代码的显现作用
说回来,place 的参数xy单位是像素,那么在不同的体系下,字体类型和巨细都是不同的,那么被放置的控件就有或许超出窗口鸿沟。因而 place 真的不常用,关于 place 进一步的信息就不再展开了。
交互
上面介绍的内容都仅限于 Tkinter 界面的可视化设计,那么现在是时分介绍一下Tkinter 界面和用户的互动了。
比方,Tkinter 界面关于事情的呼应是怎样发生的?
一般,在 Tkinter 中经过预先绑定事情和呼应处理函数,每逢事情发生时,主窗口的 mainloop 就会收到事情,然后依据绑定信息,查找到呼应处理函数并调用,来到达交互的作用。绑定的通用办法是调用各个控件的 bind()。
比方,下面我们来实现一个简略的键盘呼应互动,每次按键按下时就把对应的按键打印出来
import tkinter as tk
def handle_keypress(event):
print(event.char)
window = tk.Tk()
window.bind("<Key>", handle_keypress)
window.mainloop()
上面的代码没有增加额定的控件,除了有个空白的主窗口。其中,对主窗口 window 绑定了按键事情 Key 和处理函数 handle_keypress。
调用 bind() 最少要求输入两个参数,一个是形式为 “<event_name>” 的事情,另一个是事情处理函数。
界说处理函数 handle_keypress 时,唯一做的事情是把传入的事情字符打印到规范终端。
每逢按下键盘的按键,命令行终端就会输出对应的按键。
可是,关于按钮 Button 来说,点击事情的触发处理能够不需求运用 bind(),仅需求在实例化控件 Button 时,传入处理函数给 command 参数即可,初始化过程会主动绑定 click 事情的呼应。
上代码看看
import tkinter as tk
def handle_keypress():
print("clicked")
window = tk.Tk()
button = tk.Button(
master=window,
text="click me!",
command=handle_keypress
)
button.pack()
window.mainloop()
运行程序
用鼠标点击一下界面上的按钮,发现终端会输出字符串 clicked
由于篇幅受限,本系列教程还未完结,下一篇《Python 内置界面开发结构 Tkinter入门篇 丁》将在本大众号稍后推送,假如你对此教程有兴趣或者想和我一同沟通更多精彩内容,欢迎重视我的微信大众号【ENG八戒】,等着你哦!
《元宵彩蛋》
闹元宵了,《八戒陪你一同闹元宵2023》