以下内容为自己的学习笔记,如需求转载,请声明原文链接 微信大众号「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()

看看显现作用

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

能够看到,默许 pack 会在父窗口 window 中垂直方向按顺序包装摆放这三个静态标签 Label。

那么,假如我需求让这几个标签水平摆放呢?能够这姿态改

lbl_1.pack(side=tk.LEFT)
...
lbl_2.pack(side=tk.LEFT)
...
lbl_3.pack(side=tk.LEFT)

看看显现作用

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

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)

发动的时分,还没有拉伸窗口

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

然后拉伸看看

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

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 一一对应,所以标签不需求重复运用格子布局。

看看显现作用

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

简略汇总介绍一下其它的参数

参数 赋值 阐明
column 列序号 指定放置的列,从0开端
columnspan 列数 放置的控件横跨多少列
ipadx amount 在 x 方向增加内部填充
ipady amount 在 y 方向增加内部填充
padx amount 在 x 方向增加外部填充
pady amount 在 y 方向增加外部填充
row 行序号 指定放置的行,从0开端
rowspan number 放置的控件横跨多少行
sticky NSEW 假如单元格比较大,那么控件的指定鸿沟将贴着单元格。NSEW别离对应顶部、底部、右边、左边鸿沟

仔细的朋友会发现,一旦拉伸上面的那个矩阵标签窗口,窗口界面就会露出部分底面,矩阵标签没有跟从一同拉伸。

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

这样明显和我们的预期不符合,这个问题怎样解决呢?

能够调用父窗口的 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()

看看拉伸之后的显现作用

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

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()

看看上面代码的显现作用

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

说回来,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 时,唯一做的事情是把传入的事情字符打印到规范终端。

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

每逢按下键盘的按键,命令行终端就会输出对应的按键。

可是,关于按钮 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()

运行程序

Python 内置界面开发框架 Tkinter入门篇 丙(文末有福利彩蛋,今天可是元宵节)

用鼠标点击一下界面上的按钮,发现终端会输出字符串 clicked


由于篇幅受限,本系列教程还未完结,下一篇《Python 内置界面开发结构 Tkinter入门篇 丁》将在本大众号稍后推送,假如你对此教程有兴趣或者想和我一同沟通更多精彩内容,欢迎重视我的微信大众号【ENG八戒】,等着你哦!

《元宵彩蛋》

闹元宵了,《八戒陪你一同闹元宵2023》