Python Tkinter(一)

🍦 Tkinter是Python标准库的一部分,提供了一套用于创建图形用户界面的工具,以其简单性著称,支持多种控件如按钮、菜单等。

1 GUI库

  • GUI库
    • Tkinter
      • 标准库,轻量级,易于学习和使用。
      • 简单的应用,不需复杂的图形界面。
    • PyQt
      • 功能强大,跨平台,可创建复杂应用。
      • 需要复杂图形界面和高可用性的应用。
      • 需要安装Qt库:pip install PyQt5
    • Kivy
      • 支持多点触控,适用于触摸屏设备,跨平台。
      • 游戏开发,安装Kivy库:pip install kivy
    • wxPython
      • 跨平台,功能强大,支持复杂的GUI应用。
      • 需要跨平台支持和高度定制化的GUI应用。
      • 需要安装wxWidgets库:pip install wxPython
      • wxWidgets是C++库,而wxPython是Python的绑定。
    • PySimpleGUI
      • 简单易用,基于PyQt或Tkinter,提供更简洁的API。
      • 安装PySimpleGUI库:pip install PySimpleGUI

2 Tkinter

  • Tkinter
    • Tkinter是Python官方推荐的GUI工具包,属于标准库。
    • Python官方提供的IDLE,就是使用Tkinter开发而成的。
    • 官方手册:https://docs.python.org/zh-cn/3.13/library/tk.html
    • 查看版本,显示一个简易窗口,使用命令:python -m tkinter
1
2
3
4
5
6
7
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()

# 开启主循环,让窗口保持显示状态
window.mainloop()

3 窗口方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import time
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()

# 设置窗口名称
window.title("Tkinter")

# 设置窗口拉伸,默认允许
# window.resizable()

# 不可更改窗口大小
# window.resizable(0, 0)
# window.resizable(False, False)

# 设置窗口被允许调整的最大范围,与resizable()冲突
window.maxsize(800, 400)

# 设置窗口被允许调整的最小范围,与resizable()冲突
window.minsize(500, 250)

# 设置窗口默认大小:宽x高
window.geometry("300x150")

# 读取窗口大小前,必须刷新当前窗口
window.update()
print(
"窗口分辨率:",
(window.winfo_width(), window.winfo_height())
)
print(
"电脑分辨率:",
(
window.winfo_screenwidth(),
window.winfo_screenheight()
)
)

# 设置窗口左上角图标:ico文件类型
# 只支持本地路径,不支持线上路径
window.iconbitmap(".../file/title.ico")

# 设置窗口背景颜色
window.config(background="#6fb765")

# 设置窗口透明度
window.attributes("-alpha", 0.8)

# 设置窗口置顶
window.attributes("-topmost", True)

# 设置窗口全屏,与maxsize()冲突
# window.attributes("-fullscreen", True)

# 设置窗口显示状态:normal正常、icon最小化、zoomed最大化
# window.state("zoomed")

# 设置窗口最小化,作用同state("icon")
# window.iconify()

# 隐藏窗口,但不会销毁窗口
window.withdraw()
time.sleep(5)

# 将窗口从隐藏状态还原显示
window.deiconify()


def quit_window():
# 关闭当前窗口
window.quit()


# 延迟10秒后退出当前窗口
window.after(10000, quit_window)

# 设置文本内容,结合pack()使用
text = tk.Label(
window,
text="欢迎访问站点:https://stitch-top.github.io/",
bg="yellow", fg="red",
font=("Times", 11, "bold italic underline")
)

# 将文本放置在窗口内
text.pack()

# 添加按钮,结合pack()使用
button = tk.Button(window, text="关闭", command=window.quit)

# 将按钮放置在窗口底部
button.pack(side="bottom")

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

3-1 协议处理机制

  • 协议处理机制
    • Protocol协议处理机制,指的是应用程序和窗口管理器之间的交互。
    • 最常用的协议是WM_DELETE_WINDOW,使用该协议与窗口交互时。
    • 窗口右上角的关闭功能会失效,用户可以将其转变成调用自定义函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import tkinter as tk
# 导入对话框控件
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()


# 定义回调函数,点击右上角关闭按钮时,执行自定义的函数
def query_window():
# 显示一个警告信息,点击确认后,销毁窗口
if messagebox.showwarning("警告", "啊哦,出现了一个错误!!!"):
# 这里必须使用destroy()关闭窗口
window.destroy()


# 使用协议机制与窗口交互,并回调自定义的函数
window.protocol("WM_DELETE_WINDOW", query_window)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

3-2 封装函数形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")


# 定义回调函数
def call_back():
print("执行回调函数:", "你好呀~")


# 点击执行按钮
button = tk.Button(window, text="执行", command=call_back)
button.pack()

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

3-3 设置窗口位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()

# 设置窗口大小参数
width = 500
height = 250

# 获取屏幕尺寸,用来计算布局参数,使窗口居中
screenwidth = window.winfo_screenwidth()
screenheight = window.winfo_screenheight()
print(screenwidth, screenheight)

xoffset = (screenwidth - width) / 2
yoffset = (screenheight - height) / 2
print(xoffset, yoffset)

# %dx%d+%d+%d:width x height + xoffset + yoffset
# 注意:不能在算术运算符两侧添加空格,会将其视为分隔符,无法正确解析
center = "%dx%d+%d+%d" % (width, height, xoffset, yoffset)
window.geometry(center)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

4 标签控件

  • 标签控件
    • 标签控件(Label)用于显示窗口中的文本或者图像,不同标签可设置不同背景图。
    • 而一个控件主要由前景和背景组成,前景又分为内容区、填充区、边框区3部分。
    • 内容区使用了width、height,填充区使用padx、pady,边框区使用borderwidth。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 设置一个标签控件
label = tk.Label(
window,

# 标签显示的文本内容【内容区】
text="https://stitch-top.github.io/\n\n欢迎访问个人站点!!!",

# 控制文本或图像在标签内部的对齐方式,默认中心位置center
# 左上nw、上n、右上ne、左w、右e、左下sw、下s、右下se
anchor="center",

# 文本前景色,即文本颜色
fg="yellow",

# 当标签处于禁用状态时文本的颜色
disabledforeground="black",

# 文本的字体、大小、样式
font=("宋体", 11, "bold italic"),

# 多行文本的对齐方式,文本位置取决于anchor属性
# 参数值:left、right、center
justify="center",

# 字符下划线,默认值-1不添加,从0开始索引添加下划线
underline=0,

# 文本换行的宽度(像素),指定每一行的长度,默认值0
wraplength=330,

# 内容区和边框之间添加的间距【填充区】
# x:内容区与左右边框之间的距离(像素),水平填充
# y:内容区与上下边框之间的距离(像素),垂直填充
padx=10, pady=30,

# 边框宽度,即borderwidth【边框区】
# 单位像素,默认值为2个像素
bd=1,

# 标签的背景颜色,包括填充区
bg="yellow green",

# 标签未获得焦点时的边框高亮颜色
highlightbackground="white",

# 标签获得焦点时的边框高亮颜色
highlightcolor="yellow",

# 边框样式,默认值为flat
# 参数值:groove、raised、ridge、solid、sunken
relief="solid",

# 标签宽高,文本则是文本单元,图像则是像素
# 不设置时,会自动依据内容计算宽高
width=30, height=3,

# 鼠标从标签上方掠过时,鼠标显示的样式【其他】
# 参数值:arrow、circle、cross、plus
cursor="cross",

# 标签状态:normal、active、disabled
state="normal",

# 标签是否接受输入焦点,默认值为False
takefocus=True,
)

# 添加标签到窗口
label.pack()

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

4-1 位图属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 使用系统预定义的位图
label1 = tk.Label(window, bitmap="error", text="错误")
label1.pack(pady=10)

label2 = tk.Label(window, bitmap="info", text="信息")
label2.pack(pady=10)

label3 = tk.Label(window, bitmap="warning", text="警告")
label3.pack(pady=10)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

4-2 图片属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 显示图片
photo = tk.PhotoImage(file=".../file/label.gif")
print(type(photo))

# 将图片放在窗口右侧,GIF格式图片只会显示第一帧
# 如果想让GIF动画正常播放,需要手动实现动画循环
tk.Label(window, image=photo).pack(side="right")

# 将文字放在窗口左侧
tk.Label(
window,
text="""
盛年不重来,
一日难再晨。
及时当勉励,
岁月不待人。
""",
fg="green",
font=("楷体", 10, "bold italic"),
justify="left", padx=10
).pack(side="left")

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

5 信息控件

  • 信息控件
    • Message与Label控件类似,主要用来显示多行不可编辑的文本信息。
    • 与Label控件的不同之处在于,Message控件增加了自动分行的功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

txt = "盛年不重来,一日难再晨。及时当勉励,岁月不待人。"

# 显示多行不可编辑的文本信息(带自动分行功能)
tk.Message(
window, text=txt, width=90,
font=("华文行楷", 10, "bold")
).pack(side="top")

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

6 按钮控件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import tkinter as tk
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")


# 定义按钮点击后的回调函数
def on_click():
# 显示一个弹窗
messagebox.showinfo(title="彩蛋", message="你好呀!")


# 设置一个按钮控件
button = tk.Button(
window,

# 按钮要显示的文本内容【内容区】
text="点击",

# 按钮文本的字体、大小、样式
font=("Arial", 12),

# 按钮显示多行文本时,用来指定文本的对齐方式
# 参数值:left、right、center
justify="right",

# 控制文本或图像在标签内部的对齐方式,默认中心位置center
# 左上nw、上n、右上ne、左w、右e、左下sw、下s、右下se
anchor="center",

# 按钮的高度、宽度【填充区】
height=1, width=3,

# 内容区和边框之间添加的间距
# x:内容区与左右边框之间的距离(像素),水平填充
# y:内容区与上下边框之间的距离(像素),垂直填充
padx=10, pady=5,

# 按钮边框大小,默认2个像素【边框区】
bd=10,

# 按钮在正常状态下的背景颜色
bg="yellow green",

# 按钮在正常状态下的前景色,即按钮上文字的颜色
fg="white",

# 按钮在按下或获得焦点状态下的背景颜色
activebackground="orange",

# 按钮在按下或获得焦点状态下的前景色,即按钮上文字的颜色
activeforeground="blue",

# 按钮的高亮颜色,系统默认高亮色为SystemHighlight
highlightcolor="SystemHighlight",

# 按钮的可用状态:normal、active、disabled
state="active",

# 回调函数,当按钮被点击时执行该函数【其他】
command=on_click
)


# 当鼠标移动到按钮上时,打印颜色信息
def on_enter(event):
print("鼠标放在按钮上:", button["activebackground"])


# 当鼠标移动到按钮外时,打印颜色信息
def on_leave(event):
print("鼠标放在按钮外:", button["bg"])


button.bind("<Enter>", on_enter)
button.bind("<Leave>", on_leave)

# 添加按钮到窗口
button.pack()

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

6-1 添加图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import tkinter as tk
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")


# 定义按钮点击后的回调函数
def on_click():
# 显示一个弹窗
messagebox.showinfo(title="彩蛋", message="你好呀!")


image = tk.PhotoImage(file=r".../file/button.jpg")
print(f"图片是否存在:{image.width() > 0}")

# 设置一个按钮属性
button = tk.Button(
window,

# 按钮上要显示的图片,支持gif、png、ppm等
# 直接调用PhotoImage()赋值,会变成空白按钮显示
# image=tk.PhotoImage(file=".../file/button.gif"),
image=image,

# 回调函数,当按钮被点击时执行该函数
command=on_click
)

# 添加按钮到窗口
button.pack()

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

6-2 按钮布局

  • 按钮布局
    • 通常使用grid()函数完成按钮布局,该函数以网格形式(即行和列形式)来管理窗口布局。
    • grid()函数的sticky参数属性值与anchor参数属性值一样,函数与pack()不能混合使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import tkinter as tk
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 将两个标签分别放置在第一、二行
tk.Label(window, text="账号:").grid(row=1)
tk.Label(window, text="密码:").grid(row=2)

# 创建输入框控件
input1 = tk.Entry(window)
input1.grid(row=1, column=1, padx=60, pady=20)

# 以*形式显示密码
input2 = tk.Entry(window, show="*")
input2.grid(row=2, column=1, padx=60, pady=20)


# 定义按钮点击后的回调函数
def on_click_1():
# 显示一个弹窗
messagebox.showinfo(title="登录", message="登录成功!")


def on_click_2():
# 显示一个弹窗
messagebox.showinfo(title="退出", message="退出成功!")


# 使用grid()函数布局,并控制按钮的显示位置
tk.Button(
window, text="登录", width=10, command=on_click_1
).grid(row=5, column=0, sticky="w", padx=60, pady=20)

tk.Button(
window, text="退出", width=10, command=on_click_2
).grid(row=5, column=1, sticky="e", padx=60, pady=20)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7 输入控件

  • 输入控件
    • Entry控件是Tkinter GUI编程的基础控件之一,允许用户输入内容。
    • Entry控件除了具备一些共有的属性之外,还有一些自身的特殊属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# exportselection:值为0时,禁用“将选中文本复制到剪贴板”功能
tk.Entry(window, exportselection=0).pack(pady=3)

# exportselection:不设置,则默认启用“将选中文本复制到剪贴板”功能
tk.Entry(window).pack(pady=3)

tk.Entry(
window,

# selectbackground:选中文字时的背景颜色
selectbackground="yellow",

# selectforeground:选中文字时的前景色,即文字颜色
selectforeground="green"
).pack(pady=3)

# show:显示星号而不是实际字符
tk.Entry(window, show="*").pack(pady=3)

# textvariable:使用动态字符串StringVar()来更新Entry的值
text = tk.StringVar()
tk.Entry(window, textvariable=text).pack(pady=3)
text.set("初始文本")

scrollbar = tk.Scrollbar(
window,
orient="horizontal"
)
scrollbar.pack(side=tk.BOTTOM, fill=tk.X)

# xscrollcommand:设置宽度以创建较窄的输入框
entry = tk.Entry(
window,
xscrollcommand=scrollbar.set,
width=20
)
entry.pack(pady=3)

# 将滚动条链接到Entry
scrollbar.config(command=entry.xview)

# 模拟长文本输入以显示水平滚动条
long_text = """这是一个长字符串,超过Entry部件的宽度"""
entry.insert(0, long_text)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7-1 动态数据

  • 动态数据
    • 数据类型:StringVar()、BooleanVar()、DoubleVar()、IntVar()。
    • Python内置的数据类型无法实现界面编程的一些变量值的动态跟踪。
    • 因而使用TCL内置对象,并将这些方法创建的数据类型称为动态类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import time
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 生成动态字符串
dstr = tk.StringVar()


# 获取时间函数
def get_time():
# 获取当前时间
dstr.set(time.strftime("%H:%M:%S"))

# 每隔1s调用一次gettime()函数来获取时间
window.after(1000, get_time)


# 利用textvariable实现文本变化
tk.Label(
window, textvariable=dstr,
fg="green", font=("华文楷体", 40, "bold")
).pack()

# 调用生成时间的函数
get_time()

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7-2 常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import tkinter as tk

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")

# 创建输入框控件
entry = tk.Entry(window)
entry.pack()

# 设置输入框内的值,新版本中已弃用
# entry.set("https://stitch-top.github.io/")

# 在输入框中插入文本
entry.insert(0, "https://stitch-top.github.io/")

# 选中文本“-top”
entry.select_from(14)
entry.select_to(18)

print(entry.index("sel.first"))
print(entry.index("sel.last"))

# 删除选中的文本
entry.delete("sel.first", "sel.last")

# 删除所有的文本
# entry.delete(0, tk.END)

# 返回指定的索引值
print(entry.index("end"))
print(entry.index(tk.END))

# 选中索引值5和光标所在位置之前的字符
entry.select_adjust(5)

# 返回输入框中是否有处于选中状态的文本
print(entry.select_present())

# 取消选中状态
entry.select_clear()
print(entry.select_present())

# 选中索引值0到5之间的所有值
entry.select_range(0, 5)
# print(entry.select_present())

# 获取输出输入框的所有文本
print(entry.get())

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7-3 验证功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import tkinter as tk
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")


# 创建验证函数
def check():
if entry1.get() == "admin":
messagebox.showinfo(title="正确", message="输入正确!")
return True
else:
messagebox.showwarning(title="错误", message="输入错误!")
entry1.delete(0, tk.END)
return False


# 新建文本标签
label1 = tk.Label(window, text="账号:")
label2 = tk.Label(window, text="密码:")
label1.grid(row=0, padx=90, pady=20)
label2.grid(row=1, padx=90, pady=20)

# 创建动态字符串
dystr = tk.StringVar()

# 使用验证参数validata,参数值为focusout
entry1 = tk.Entry(
window, textvariable=dystr,

# validate:指定验证方式
# focus:获得或失去焦点时,验证输入框内容是否正确
# focusin:获得焦点时验证
# focusout:失去焦点时验证
# key:输入框被编辑时验证
# all:出现上述任何一种情况时验证
# none:默认不启用验证功能,注意这里none是字符串
validate="focusout",

# validatecommand:指定自定义的验证函数
# 这里自定义的验证函数只能返回True或False
validatecommand=check,

# 当指定的验证函数返回False时,使用该参数再指定一个验证函数
# invalidcommand=""
)
entry2 = tk.Entry(window)

# 对控件进行布局管理,放在文本标签的后面
entry1.grid(row=0, column=1, padx=30)
entry2.grid(row=1, column=1, padx=30)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7-4 验证注册

  • Tkinter为验证函数提供了一些额外的选项,使用这些选项之前,需要提前注册验证函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tkinter as tk
from tkinter import messagebox

# 调用Tk()创建主窗口
window = tk.Tk()
window.geometry("500x250")


# 创建验证函数
def check(strings, reason, id):
if entry1.get() == "admin":
messagebox.showinfo(title="正确", message="输入正确!")
print(strings, reason, id)
return True
else:
messagebox.showwarning(title="错误", message="输入错误!")
print(strings, reason, id)
return False


# 对验证函数进行注册
CheckTest = window.register(check)

# 新建文本标签
label1 = tk.Label(window, text="账号:")
label2 = tk.Label(window, text="密码:")
label1.grid(row=0, padx=90, pady=20)
label2.grid(row=1, padx=90, pady=20)

# 创建动态字符串
dystr = tk.StringVar()

# 使用验证参数validata,参数值为focusout
entry1 = tk.Entry(
window, textvariable=dystr,

# validate:指定验证方式
validate="focusout",

# 验证函数的额外选项
# %d:0表示删除,1表示插入,2表示焦点离开
# %i:插入索引
# %P:指定输入框的文本内容,当输入框的值允许改变时该选项才生效
# %s:调用验证函数前输入框的文本内容
# %S:插入或删除操作触发验证函数时才生效,表示被插入或删除的内容
# %v:当前Entry控件的validate参数值
# %V:触发验证函数的原因,值为focus、...、key、none中的一个
# %W:控件类型
validatecommand=(CheckTest, "%P", "%V", "%W"),
)
entry2 = tk.Entry(window)

# 对控件进行布局管理,放在文本标签的后面
entry1.grid(row=0, column=1, padx=30)
entry2.grid(row=1, column=1, padx=30)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

7-5 验证实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from tkinter import *

# 调用Tk()创建主窗口
window = Tk()
window.geometry("500x250")

# 创建一个容器包含其他控件
frame = Frame(window)

# 创建一个Label控件
label = Label(frame)

# 创建一个Entry控件
entry = Entry(frame)

# 读取用户输入的表达式
expression = StringVar()

# 将用户输入的表达式显示在Entry控件上
entry["textvariable"] = expression


# 创建一个计算器
def calculator():
# 输入的表达式,计算结果后转换为字符串
result = "=" + str(eval(expression.get()))

# 将计算结果显示在Label控件上
label.config(text=result)


# 创建一个Button控件,输入完毕,单击此按钮计算表达式结果
button = Button(frame, text="等于", command=calculator)

# 设置Entry控件为焦点
entry.focus()
frame.pack(pady=10)

# Entry控件位于窗口上方
entry.pack(pady=10)

# Label控件位于窗口左方
label.pack(side="left", pady=10)

# Button控件位于窗口右方
button.pack(side="right", pady=10)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

8 旋钮控件

  • 旋钮控件
    • 旋钮控件(Spinbox)是Entry控件的升级版,是Tkinter8.4版本后新增的控件。
    • 该控件不仅允许直接输入内容,还支持使用微调选择器(即上下按钮调节器)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from tkinter import *

# 调用Tk()创建主窗口
window = Tk()
window.geometry("500x250")

# 数字使用from_和to参数,范围0~20,2步长递增减
Spinbox(
window, from_=0, to=20,
increment=2, bg="yellow green"
).pack(pady=10)

# 字符串使用values参数,以元组形式传参
Spinbox(
window,
values=("C", "Java", "Python")
).pack(pady=10)

# 设置窗口主循环,一直显示,直到窗口被关闭
window.mainloop()

Python Tkinter(一)
https://stitch-top.github.io/2024/12/31/python/python14-python-tkinter-yi/
作者
Dr.626
发布于
2024年12月31日 22:30:00
许可协议