目录
一、为什么 Tkinter 是 Python GUI 的 “入门首选”?
2.2 第一个 Tkinter 窗口:Hello World!

class 卑微码农:
def __init__(self):
self.技能 = ['能读懂十年前祖传代码', '擅长用Ctrl+C/V搭建世界', '信奉"能跑就别动"的玄学']
self.发量 = 100 # 初始发量
self.咖啡因耐受度 = '极限'
def 修Bug(self, bug):
try:
# 试图用玄学解决问题
if bug.严重程度 == '离谱':
print("这一定是环境问题!")
else:
print("让我看看是谁又没写注释...哦,是我自己。")
except Exception as e:
# 如果try块都救不了,那就...
print("重启一下试试?")
self.发量 -= 1 # 每解决一个bug,头发-1
# 实例化一个我
我 = 卑微码农()
引言
在 Python 开发中,你是否想过给写好的脚本加一个可视化界面?比如给数据处理脚本做个操作面板,给爬虫工具整个参数配置窗口,或者开发一个简单的记事本、计算器?而 Tkinter——Python 自带的 GUI(图形用户界面)库,正是实现这些需求的 “轻量神器”。

它无需额外安装,随 Python 自带,语法简洁,能快速搭建出美观实用的桌面应用。无论是新手入门 GUI 编程,还是开发者快速开发小工具,Tkinter 都能满足需求。本文从实际场景出发,通过 “基础入门→组件详解→布局管理→事件处理→进阶实战” 的递进结构,搭配可直接运行的代码示例,帮你从 0 到 1 掌握 Tkinter,轻松开发自己的桌面应用。
一、为什么 Tkinter 是 Python GUI 的 “入门首选”?

在 Python GUI 库中,除了 Tkinter,还有 PyQt、wxPython 等选择,但 Tkinter 的优势对新手和轻量开发场景尤为明显:
- 零成本入门:随 Python 安装,无需额外配置,开箱即用;
- 语法简洁直观:API 设计清晰,几句代码就能创建一个窗口,上手门槛低;
- 轻量高效:体积小、运行快,适合开发小型桌面工具(如计算器、记事本、数据可视化面板);
- 跨平台兼容:支持 Windows、Linux、MacOS,无需修改代码即可在不同系统运行;
- 功能足够用:内置丰富的组件(按钮、文本框、菜单等),满足大部分轻量应用需求。
如果你的需求是开发小型桌面工具,而非复杂的商业软件,Tkinter 绝对是性价比最高的选择。
二、基础入门:3 分钟创建第一个 Tkinter 窗口

2.1 环境准备:无需额外安装
Tkinter 是 Python 标准库的一部分,只要安装了 Python,就可以直接使用,无需额外 pip 安装。
验证 Tkinter 是否可用:
import tkinter as tk # 导入Tkinter库,约定简称为tk
# 查看Tkinter版本(可选)
print("Tkinter版本:", tk.TkVersion) # 输出如:8.6
若运行无报错,则说明 Tkinter 可用。
2.2 第一个 Tkinter 窗口:Hello World!
用 Tkinter 创建窗口只需 3 步:创建主窗口→添加组件→启动消息循环。
import tkinter as tk
# 1. 创建主窗口(程序的主容器)
root = tk.Tk()
root.title("我的第一个Tkinter窗口") # 设置窗口标题
root.geometry("400x300") # 设置窗口大小(宽x高,单位:像素)
# 2. 添加组件(这里添加一个标签,显示文本)
label = tk.Label(root, text="Hello Tkinter!", font=("Arial", 16))
label.pack() # 布局组件(后续详解布局方式)
# 3. 启动消息循环(让窗口保持显示,等待用户操作)
root.mainloop()
运行代码后,会弹出一个 400x300 的窗口,显示 “Hello Tkinter!” 文本。这就是 Tkinter 的基本框架,所有复杂应用都基于这个结构扩展。
2.3 窗口核心配置:标题、大小、图标
创建窗口后,常用的配置如下:
import tkinter as tk
root = tk.Tk()
# 1. 设置窗口标题
root.title("窗口配置示例")
# 2. 设置窗口大小和位置(宽x高+左偏移+上偏移)
root.geometry("500x400+100+100") # 500宽、400高,窗口左上角在屏幕(100,100)位置
# 3. 禁止调整窗口大小(宽、高都禁止)
root.resizable(False, False)
# 4. 设置窗口图标(仅Windows系统有效,需要.ico格式文件)
# root.iconbitmap("icon.ico") # 取消注释并指定图标路径
# 5. 设置窗口背景色(支持英文颜色名、十六进制代码)
root.config(bg="#f0f0f0") # 浅灰色背景
root.mainloop()
三、核心组件详解:常用控件的使用方法

Tkinter 提供了丰富的内置组件,以下是最常用的 8 种组件,每种都包含 “功能说明 + 代码示例 + 参数解析”。
3.1 标签(Label):显示文本或图片
Label 用于显示静态文本或图片,不能被用户编辑。
示例 1:显示文本
import tkinter as tk
root = tk.Tk()
root.title("Label组件示例")
root.geometry("300x200")
# 创建文本标签
label1 = tk.Label(
root,
text="这是一个文本标签",
font=("微软雅黑", 14), # 字体和大小
fg="red", # 文字颜色
bg="#f0f0f0", # 背景色
width=20, # 宽度(单位:字符)
height=2 # 高度(单位:字符)
)
label1.pack(pady=10) # pady=10:上下各留10像素空白
root.mainloop()
示例 2:显示图片
import tkinter as tk
from PIL import Image, ImageTk # 需要安装Pillow库:pip install pillow
root = tk.Tk()
root.title("显示图片")
root.geometry("300x300")
# 打开图片并调整大小
image = Image.open("test.jpg") # 替换为你的图片路径
image = image.resize((200, 200)) # 缩放为200x200像素
photo = ImageTk.PhotoImage(image) # 转换为Tkinter支持的图片格式
# 创建图片标签
label = tk.Label(root, image=photo)
label.pack()
# 注意:必须保留对图片对象的引用,否则图片会消失
label.photo = photo
root.mainloop()
3.2 按钮(Button):触发交互事件
Button 是最常用的交互组件,用户点击后会触发预设的函数。
基础示例:点击按钮显示提示
import tkinter as tk
from tkinter import messagebox # 用于弹出提示框
root = tk.Tk()
root.title("Button组件示例")
root.geometry("300x200")
# 定义按钮点击后的触发函数
def on_click():
messagebox.showinfo("提示", "你点击了按钮!") # 弹出信息提示框
# 创建按钮
button = tk.Button(
root,
text="点击我",
font=("微软雅黑", 12),
width=10,
height=1,
bg="#4CAF50", # 背景色(绿色)
fg="white", # 文字颜色(白色)
command=on_click # 绑定点击事件(触发on_click函数)
)
button.pack(pady=50)
root.mainloop()
进阶:按钮状态控制(禁用 / 启用)
import tkinter as tk
root = tk.Tk()
root.title("按钮状态控制")
root.geometry("300x200")
def disable_btn():
btn.config(state=tk.DISABLED) # 禁用按钮
label.config(text="按钮已禁用")
def enable_btn():
btn.config(state=tk.NORMAL) # 启用按钮
label.config(text="按钮已启用")
# 创建按钮和标签
btn = tk.Button(root, text="可点击按钮", command=lambda: print("点击了"))
btn.pack(pady=20)
label = tk.Label(root, text="")
label.pack(pady=10)
tk.Button(root, text="禁用按钮", command=disable_btn).pack(side=tk.LEFT, padx=20)
tk.Button(root, text="启用按钮", command=enable_btn).pack(side=tk.RIGHT, padx=20)
root.mainloop()
3.3 输入框(Entry):获取单行文本输入
Entry 用于接收用户的单行文本输入(如用户名、密码)。
示例:获取用户名和密码
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("Entry组件示例")
root.geometry("300x250")
# 定义提交函数
def submit():
username = entry1.get() # 获取第一个输入框的内容
password = entry2.get() # 获取第二个输入框的内容
if username == "admin" and password == "123456":
messagebox.showinfo("成功", "登录成功!")
else:
messagebox.showerror("错误", "用户名或密码错误!")
# 用户名标签和输入框
tk.Label(root, text="用户名:", font=("微软雅黑", 12)).pack(pady=10)
entry1 = tk.Entry(root, font=("微软雅黑", 12), width=20)
entry1.pack()
# 密码标签和输入框(show="*"隐藏输入内容)
tk.Label(root, text="密码:", font=("微软雅黑", 12)).pack(pady=10)
entry2 = tk.Entry(root, font=("微软雅黑", 12), width=20, show="*")
entry2.pack()
# 提交按钮
tk.Button(root, text="登录", command=submit, font=("微软雅黑", 12)).pack(pady=20)
root.mainloop()
3.4 文本框(Text):获取多行文本输入
Text 用于接收多行文本输入(如备注、日志),支持换行和文本格式化。
示例:文本编辑与内容获取
import tkinter as tk
root = tk.Tk()
root.title("Text组件示例")
root.geometry("400x300")
# 定义获取文本的函数
def get_text():
content = text.get("1.0", tk.END) # 获取全部文本:从第1行第0列到末尾
label.config(text="你输入的内容:\n" + content)
# 创建文本框
text = tk.Text(
root,
font=("微软雅黑", 12),
width=30,
height=10,
wrap=tk.WORD # 换行方式:按单词换行
)
text.pack(pady=10)
# 插入默认文本
text.insert(tk.END, "请输入多行文本...")
# 按钮和标签
tk.Button(root, text="获取文本", command=get_text).pack(pady=5)
label = tk.Label(root, text="", font=("微软雅黑", 10))
label.pack(pady=5)
root.mainloop()
3.5 复选框(Checkbutton):多选功能
Checkbutton 用于实现多选功能(如选择兴趣爱好),用户可勾选多个选项。
示例:兴趣爱好选择
import tkinter as tk
root = tk.Tk()
root.title("Checkbutton组件示例")
root.geometry("300x200")
# 定义变量存储勾选状态(IntVar:整数变量,0=未勾选,1=勾选)
hobby1 = tk.IntVar()
hobby2 = tk.IntVar()
hobby3 = tk.IntVar()
# 定义获取选择结果的函数
def show_result():
result = []
if hobby1.get() == 1:
result.append("编程")
if hobby2.get() == 1:
result.append("阅读")
if hobby3.get() == 1:
result.append("运动")
label.config(text="你的兴趣:" + "、".join(result))
# 创建复选框
tk.Checkbutton(root, text="编程", variable=hobby1, font=("微软雅黑", 12)).pack(pady=5)
tk.Checkbutton(root, text="阅读", variable=hobby2, font=("微软雅黑", 12)).pack(pady=5)
tk.Checkbutton(root, text="运动", variable=hobby3, font=("微软雅黑", 12)).pack(pady=5)
# 按钮和标签
tk.Button(root, text="提交", command=show_result).pack(pady=10)
label = tk.Label(root, text="", font=("微软雅黑", 12))
label.pack()
root.mainloop()
3.6 单选按钮(Radiobutton):单选功能
Radiobutton 用于实现单选功能(如选择性别、学历),同一组中只能勾选一个选项。
示例:性别选择
import tkinter as tk
root = tk.Tk()
root.title("Radiobutton组件示例")
root.geometry("300x200")
# 定义变量存储选择结果(同一组单选按钮必须绑定同一个变量)
gender = tk.StringVar(value="男") # 默认选择“男”
# 定义显示选择结果的函数
def show_gender():
label.config(text="你的性别:" + gender.get())
# 创建单选按钮(group=1表示同一组)
tk.Radiobutton(
root,
text="男",
variable=gender,
value="男",
font=("微软雅黑", 12),
command=show_gender
).pack(pady=10)
tk.Radiobutton(
root,
text="女",
variable=gender,
value="女",
font=("微软雅黑", 12),
command=show_gender
).pack(pady=10)
# 标签
label = tk.Label(root, text="你的性别:男", font=("微软雅黑", 12))
label.pack(pady=20)
root.mainloop()
3.7 下拉菜单(OptionMenu):选择预设选项
OptionMenu 用于提供下拉选择列表,用户从预设选项中选择一个(如选择城市、年级)。
示例:城市选择
import tkinter as tk
root = tk.Tk()
root.title("OptionMenu组件示例")
root.geometry("300x200")
# 定义变量存储选择结果
city = tk.StringVar(value="北京") # 默认选择“北京”
# 定义显示选择结果的函数
def show_city(*args): # *args必须加,用于接收变量变化事件
label.config(text="你选择的城市:" + city.get())
# 绑定变量变化事件(选择项改变时触发函数)
city.trace("w", show_city)
# 创建下拉菜单(选项列表)
cities = ["北京", "上海", "广州", "深圳", "杭州"]
option_menu = tk.OptionMenu(root, city, *cities) # *cities:解包选项列表
option_menu.config(font=("微软雅黑", 12), width=10)
option_menu.pack(pady=50)
# 标签
label = tk.Label(root, text="你选择的城市:北京", font=("微软雅黑", 12))
label.pack()
root.mainloop()
3.8 滑块(Scale):调节数值
Scale 用于让用户通过拖动滑块调节数值(如调节音量、亮度、字体大小)。
示例:调节字体大小
import tkinter as tk
root = tk.Tk()
root.title("Scale组件示例")
root.geometry("300x200")
# 定义变量存储滑块数值
font_size = tk.IntVar(value=12) # 默认值12
# 定义调节字体大小的函数
def adjust_font(*args):
size = font_size.get()
label.config(font=("微软雅黑", size))
label.config(text=f"当前字体大小:{size}")
# 绑定变量变化事件
font_size.trace("w", adjust_font)
# 创建滑块(水平方向)
scale = tk.Scale(
root,
variable=font_size,
from_=10, # 最小值
to=30, # 最大值
orient=tk.HORIZONTAL, # 水平方向(默认垂直)
length=200, # 滑块长度
font=("微软雅黑", 10)
)
scale.pack(pady=30)
# 标签
label = tk.Label(root, text="当前字体大小:12", font=("微软雅黑", 12))
label.pack()
root.mainloop()
四、布局管理:让组件整齐排列

Tkinter 提供三种布局方式,用于控制组件在窗口中的位置和大小,实际开发中常用grid和pack。
4.1 pack 布局:简单的上下 / 左右排列
pack是最基础的布局方式,组件会按添加顺序自动排列(默认垂直排列),适合简单界面。
示例:垂直和水平排列
import tkinter as tk
root = tk.Tk()
root.title("pack布局示例")
root.geometry("300x250")
# 垂直排列(默认)
tk.Button(root, text="按钮1", bg="red", fg="white").pack(fill=tk.X, pady=2) # fill=tk.X:水平填充
tk.Button(root, text="按钮2", bg="green", fg="white").pack(fill=tk.X, pady=2)
tk.Button(root, text="按钮3", bg="blue", fg="white").pack(fill=tk.X, pady=2)
# 水平排列(side=tk.LEFT)
tk.Button(root, text="左", bg="yellow").pack(side=tk.LEFT, fill=tk.Y, padx=2) # fill=tk.Y:垂直填充
tk.Button(root, text="中", bg="orange").pack(side=tk.LEFT, fill=tk.Y, padx=2)
tk.Button(root, text="右", bg="purple").pack(side=tk.LEFT, fill=tk.Y, padx=2)
root.mainloop()
关键参数:
side:排列方向(tk.TOP上、tk.BOTTOM下、tk.LEFT左、tk.RIGHT右);fill:填充方式(tk.NONE不填充、tk.X水平填充、tk.Y垂直填充、tk.BOTH双向填充);padx/pady:组件与其他组件的水平 / 垂直间距。
4.2 grid 布局:表格形式排列
grid是最常用的布局方式,组件按 “行 × 列” 的表格排列,适合复杂界面(如登录窗口、数据表格)。
示例:登录窗口布局
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("grid布局示例:登录窗口")
root.geometry("300x200")
# 用户名标签(第0行第0列)
tk.Label(root, text="用户名:", font=("微软雅黑", 12)).grid(row=0, column=0, padx=10, pady=20, sticky=tk.E)
# 用户名输入框(第0行第1列)
entry1 = tk.Entry(root, font=("微软雅黑", 12))
entry1.grid(row=0, column=1, padx=10, pady=20)
# 密码标签(第1行第0列)
tk.Label(root, text="密码:", font=("微软雅黑", 12)).grid(row=1, column=0, padx=10, pady=5, sticky=tk.E)
# 密码输入框(第1行第1列)
entry2 = tk.Entry(root, font=("微软雅黑", 12), show="*")
entry2.grid(row=1, column=1, padx=10, pady=5)
# 登录按钮(第2行第0-1列,跨两列)
tk.Button(root, text="登录", command=lambda: messagebox.showinfo("提示", "登录中...")).grid(
row=2, column=0, columnspan=2, pady=10
)
root.mainloop()
关键参数:
row/column:组件所在的行 / 列(从 0 开始计数);columnspan/rowspan:组件跨列 / 跨行的数量;sticky:组件在单元格中的对齐方式(tk.N北、tk.S南、tk.E东、tk.W西,组合如tk.EW水平居中)。
4.3 place 布局:固定位置和大小
place通过指定组件的绝对坐标(x/y)和大小(宽 / 高)来布局,适合需要精确定位的场景,但不适应窗口大小变化。
示例:固定位置的按钮
import tkinter as tk
root = tk.Tk()
root.title("place布局示例")
root.geometry("300x200")
# 固定位置(x=50, y=50)和大小(宽100,高30)
tk.Button(root, text="固定位置按钮").place(x=50, y=50, width=100, height=30)
# 相对位置(相对于窗口宽高的比例)
tk.Button(root, text="相对位置按钮").place(relx=0.5, rely=0.5, anchor=tk.CENTER) # 窗口中心
root.mainloop()
关键参数:
x/y:绝对坐标(窗口左上角为原点);relx/rely:相对坐标(0-1,相对于窗口宽 / 高的比例);width/height:绝对大小;relwidth/relheight:相对大小(相对于窗口宽 / 高的比例)。
五、事件处理:让组件 “响应” 用户操作

Tkinter 的交互核心是 “事件驱动”,用户的操作(点击、键盘输入、鼠标移动)会触发对应的事件,通过绑定函数来处理这些事件。
5.1 事件绑定的三种方式
方式 1:组件参数command(最简单)
适用于按钮、菜单等组件,直接绑定函数:
import tkinter as tk
root = tk.Tk()
def on_click():
print("按钮被点击了!")
tk.Button(root, text="点击我", command=on_click).pack()
root.mainloop()
方式 2:bind方法(绑定任意事件)
适用于所有组件,可绑定键盘、鼠标等事件,语法:组件.bind(事件类型, 处理函数)。
import tkinter as tk
root = tk.Tk()
root.title("bind事件绑定")
root.geometry("300x200")
# 定义事件处理函数(必须接收event参数)
def on_key_press(event):
label.config(text=f"你按下了:{event.keysym}") # event.keysym:按键名称
def on_mouse_move(event):
label2.config(text=f"鼠标位置:({event.x}, {event.y})") # event.x/event.y:鼠标坐标
# 绑定键盘按下事件(<Key>)
root.bind("<Key>", on_key_press)
# 绑定鼠标移动事件(<Motion>)
root.bind("<Motion>", on_mouse_move)
# 标签
label = tk.Label(root, text="按下任意键...", font=("微软雅黑", 12))
label.pack(pady=20)
label2 = tk.Label(root, text="移动鼠标...", font=("微软雅黑", 12))
label2.pack(pady=20)
root.mainloop()
方式 3:bind_class方法(绑定组件类事件)
绑定某一类组件的所有实例(如所有按钮点击事件):
import tkinter as tk
root = tk.Tk()
def on_btn_click(event):
print(f"按钮{event.widget['text']}被点击了!") # event.widget:触发事件的组件
# 绑定所有Button组件的点击事件
root.bind_class("Button", "<Button-1>", on_btn_click)
tk.Button(root, text="按钮1").pack()
tk.Button(root, text="按钮2").pack()
root.mainloop()
5.2 常用事件类型
| 事件类型 | 说明 |
|---|---|
<Button-1> | 鼠标左键点击 |
<Button-3> | 鼠标右键点击 |
<Motion> | 鼠标移动 |
<Key> | 任意键盘按键按下 |
<Return> | 回车键按下 |
<FocusIn> | 组件获得焦点 |
<FocusOut> | 组件失去焦点 |
<Configure> | 窗口大小改变 |
六、进阶功能:打造专业级桌面应用

6.1 菜单(Menu):添加程序菜单栏
菜单是桌面应用的标准组件,用于组织功能(如文件、编辑、帮助)。
示例:带菜单的窗口
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("菜单示例")
root.geometry("400x300")
# 1. 创建主菜单
menu_bar = tk.Menu(root)
# 2. 创建“文件”子菜单
file_menu = tk.Menu(menu_bar, tearoff=0) # tearoff=0:禁止分离菜单
file_menu.add_command(label="新建", command=lambda: messagebox.showinfo("提示", "新建文件"))
file_menu.add_command(label="打开", command=lambda: messagebox.showinfo("提示", "打开文件"))
file_menu.add_separator() # 添加分隔线
file_menu.add_command(label="退出", command=root.quit) # 退出程序
# 3. 创建“编辑”子菜单
edit_menu = tk.Menu(menu_bar, tearoff=0)
edit_menu.add_command(label="复制", command=lambda: print("复制"))
edit_menu.add_command(label="粘贴", command=lambda: print("粘贴"))
# 4. 将子菜单添加到主菜单
menu_bar.add_cascade(label="文件", menu=file_menu)
menu_bar.add_cascade(label="编辑", menu=edit_menu)
# 5. 给窗口设置主菜单
root.config(menu=menu_bar)
root.mainloop()
6.2 对话框(Dialog):弹出交互窗口
Tkinter 提供内置对话框,用于显示提示、警告、输入等,无需手动创建窗口。
常用对话框示例
import tkinter as tk
from tkinter import messagebox, filedialog, simpledialog
root = tk.Tk()
root.title("对话框示例")
root.geometry("300x200")
# 1. 信息提示框
def show_info():
messagebox.showinfo("信息", "这是一个信息提示框!")
# 2. 警告框
def show_warning():
messagebox.showwarning("警告", "这是一个警告框!")
# 3. 错误框
def show_error():
messagebox.showerror("错误", "这是一个错误框!")
# 4. 确认框(返回True/False)
def show_confirm():
result = messagebox.askyesno("确认", "你确定要退出吗?")
if result:
root.quit()
# 5. 文件选择框
def select_file():
file_path = filedialog.askopenfilename(
title="选择文件",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")] # 筛选文件类型
)
label.config(text=f"选择的文件:{file_path}")
# 6. 输入对话框
def input_text():
text = simpledialog.askstring("输入", "请输入你的名字:")
if text:
label.config(text=f"你好,{text}!")
# 按钮布局
tk.Button(root, text="信息框", command=show_info).grid(row=0, column=0, padx=5, pady=10)
tk.Button(root, text="警告框", command=show_warning).grid(row=0, column=1, padx=5, pady=10)
tk.Button(root, text="错误框", command=show_error).grid(row=0, column=2, padx=5, pady=10)
tk.Button(root, text="确认框", command=show_confirm).grid(row=1, column=0, padx=5, pady=10)
tk.Button(root, text="选择文件", command=select_file).grid(row=1, column=1, padx=5, pady=10)
tk.Button(root, text="输入框", command=input_text).grid(row=1, column=2, padx=5, pady=10)
# 标签
label = tk.Label(root, text="", font=("微软雅黑", 10))
label.grid(row=2, column=0, columnspan=3, pady=10)
root.mainloop()
6.3 多线程:避免界面卡顿
当 Tkinter 程序执行耗时操作(如文件下载、数据处理)时,主线程会被阻塞,导致界面卡顿。解决方法是用多线程将耗时操作放在子线程中执行。
示例:多线程处理耗时任务
import tkinter as tk
import threading
import time
root = tk.Tk()
root.title("多线程示例")
root.geometry("300x200")
# 耗时任务函数(在子线程中执行)
def long_task():
for i in range(1, 11):
time.sleep(1) # 模拟耗时操作(每秒执行一次)
# 更新界面(必须在主线程中执行,用after方法)
root.after(0, update_progress, i)
# 更新进度的函数(在主线程中执行)
def update_progress(progress):
label.config(text=f"进度:{progress}0%")
if progress == 10:
label.config(text="任务完成!")
# 启动子线程执行耗时任务
def start_task():
label.config(text="任务开始...")
# 创建并启动子线程
thread = threading.Thread(target=long_task)
thread.daemon = True # 守护线程:主程序退出时子线程也退出
thread.start()
# 按钮和标签
tk.Button(root, text="开始耗时任务", command=start_task, font=("微软雅黑", 12)).pack(pady=50)
label = tk.Label(root, text="等待任务开始...", font=("微软雅黑", 12))
label.pack()
root.mainloop()
6.4 界面美化:使用 ttk 样式
Tkinter 的默认组件样式较简单,可使用ttk(Tkinter 的主题化组件库)美化界面,支持更多样式定制。
示例:ttk 美化界面
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title("ttk美化示例")
root.geometry("300x250")
# 设置ttk主题(不同系统支持的主题不同)
style = ttk.Style(root)
print("支持的主题:", style.theme_names()) # 查看系统支持的主题
style.theme_use("clam") # 选择主题(如clam、alt、default)
# 美化按钮
ttk.Button(root, text="ttk按钮1").pack(pady=10)
ttk.Button(root, text="ttk按钮2").pack(pady=10)
# 美化标签
ttk.Label(root, text="ttk标签:", font=("微软雅黑", 12)).pack(pady=5)
# 美化输入框
ttk.Entry(root, font=("微软雅黑", 12)).pack(pady=5)
# 美化滑块
ttk.Scale(root, orient=tk.HORIZONTAL).pack(pady=10, fill=tk.X, padx=20)
root.mainloop()
七、实战案例:开发一个完整的记事本应用

结合前面的知识点,开发一个简单的记事本应用,支持新建、打开、保存文件,以及文本编辑功能。
7.1 功能需求
- 支持新建空白文档;
- 支持打开本地文本文件;
- 支持保存文档到本地;
- 支持文本编辑(换行、格式化)。
7.2 代码实现
import tkinter as tk
from tkinter import Menu, filedialog, messagebox
class Notepad:
def __init__(self, root):
self.root = root
self.root.title("简易记事本")
self.root.geometry("800x600")
# 初始化文件路径(未保存时为None)
self.file_path = None
# 1. 创建文本框(核心组件)
self.text = tk.Text(
root,
font=("微软雅黑", 12),
wrap=tk.WORD
)
self.text.pack(fill=tk.BOTH, expand=True) # 填充整个窗口
# 2. 创建菜单
self.create_menu()
def create_menu(self):
# 主菜单
menu_bar = Menu(self.root)
# 文件菜单
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="新建", command=self.new_file)
file_menu.add_command(label="打开", command=self.open_file)
file_menu.add_command(label="保存", command=self.save_file)
file_menu.add_command(label="另存为", command=self.save_as_file)
file_menu.add_separator()
file_menu.add_command(label="退出", command=self.root.quit)
# 编辑菜单
edit_menu = Menu(menu_bar, tearoff=0)
edit_menu.add_command(label="复制", command=self.copy_text)
edit_menu.add_command(label="剪切", command=self.cut_text)
edit_menu.add_command(label="粘贴", command=self.paste_text)
# 帮助菜单
help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="关于", command=self.show_about)
# 添加到主菜单
menu_bar.add_cascade(label="文件", menu=file_menu)
menu_bar.add_cascade(label="编辑", menu=edit_menu)
menu_bar.add_cascade(label="帮助", menu=help_menu)
self.root.config(menu=menu_bar)
# 新建文件
def new_file(self):
if self.text.get("1.0", tk.END).strip(): # 文本框非空
result = messagebox.askyesno("提示", "是否保存当前文件?")
if result:
self.save_file()
self.text.delete("1.0", tk.END) # 清空文本框
self.file_path = None
self.root.title("简易记事本 - 未命名")
# 打开文件
def open_file(self):
file_path = filedialog.askopenfilename(
title="打开文件",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
self.file_path = file_path
# 读取文件内容并显示
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
self.text.delete("1.0", tk.END)
self.text.insert(tk.END, content)
# 更新窗口标题
self.root.title(f"简易记事本 - {file_path}")
# 保存文件
def save_file(self):
if self.file_path:
# 保存到已有的文件
content = self.text.get("1.0", tk.END)
with open(self.file_path, "w", encoding="utf-8") as f:
f.write(content)
messagebox.showinfo("提示", "保存成功!")
else:
# 未指定路径,调用另存为
self.save_as_file()
# 另存为文件
def save_as_file(self):
file_path = filedialog.asksaveasfilename(
title="另存为",
defaultextension=".txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
self.file_path = file_path
content = self.text.get("1.0", tk.END)
with open(file_path, "w", encoding="utf-8") as f:
f.write(content)
self.root.title(f"简易记事本 - {file_path}")
messagebox.showinfo("提示", "保存成功!")
# 复制文本
def copy_text(self):
self.text.clipboard_clear()
self.text.clipboard_append(self.text.selection_get())
# 剪切文本
def cut_text(self):
self.copy_text()
self.text.delete(tk.SEL_FIRST, tk.SEL_LAST)
# 粘贴文本
def paste_text(self):
self.text.insert(tk.INSERT, self.text.clipboard_get())
# 关于记事本
def show_about(self):
messagebox.showinfo(
"关于简易记事本",
"这是一个基于Tkinter开发的记事本应用\n版本:1.0"
)
if __name__ == "__main__":
root = tk.Tk()
app = Notepad(root)
root.mainloop()
7.3 功能演示
- 运行代码后,会打开一个 800x600 的记事本窗口;
- 点击 “文件” 菜单,可新建、打开、保存文件;
- 点击 “编辑” 菜单,可复制、剪切、粘贴文本;
- 文本框支持多行编辑,自动换行。
八、避坑指南:Tkinter 新手常犯的 6 个错误
1. 忘记启动消息循环(mainloop())
错误:创建窗口和组件后,运行代码无窗口显示。解决:必须在最后调用root.mainloop(),让窗口进入事件循环。
2. 组件未布局(pack/grid/place)
错误:创建组件后,窗口中看不到组件。解决:所有组件都必须调用pack()、grid()或place()中的一种进行布局。
3. 图片显示消失(PhotoImage 垃圾回收)
错误:用 PhotoImage 显示图片时,图片一闪而过。解决:保留对图片对象的引用(如label.photo = photo)。
4. 主线程被阻塞(界面卡顿)
错误:在主线程中执行耗时操作,导致界面无法响应。解决:将耗时操作放在子线程中,用root.after()更新界面。
5. 中文显示乱码
错误:标签、菜单中的中文显示为方块。解决:确保代码文件编码为 UTF-8,或在字符串前加u(Python2),Python3 默认 UTF-8,通常无需额外处理。
6. 事件处理函数参数错误
错误:用bind绑定事件时,处理函数未接收event参数。解决:bind绑定的函数必须接收event参数(即使不用)。
九、总结:Tkinter 学习路径与进阶建议
核心知识点回顾
- 基础框架:创建主窗口、添加组件、启动消息循环;
- 核心组件:Label、Button、Entry、Text 等常用控件的使用;
- 布局管理:掌握 pack(简单)、grid(复杂)、place(精确定位);
- 事件处理:绑定用户操作(点击、键盘、鼠标),实现交互;
- 进阶功能:菜单、对话框、多线程、界面美化;
- 实战应用:开发小型桌面工具(如记事本、计算器)。
进阶学习建议
- 学习第三方美化库:如
tkinter.ttkthemes(更多主题)、customtkinter(现代化样式); - 开发复杂应用:结合数据库(SQLite)开发带数据存储的应用(如通讯录、备忘录);
- 集成其他库:结合 Pandas 处理数据,Matplotlib 绘制图表,开发数据可视化工具;
- 打包成 exe 文件:用
pyinstaller将 Tkinter 程序打包为 Windows 可执行文件(pyinstaller -F -w app.py); - 学习其他 GUI 库:若需要开发复杂商业软件,可学习 PyQt(功能更强、样式更丰富)。
Tkinter 的学习核心是 “多动手实践”—— 从简单的窗口开始,逐步添加组件和功能,遇到问题时查看官方文档或搜索解决方案。它虽然简单,但足够强大,能帮你快速将 Python 脚本转化为可视化桌面应用,提升工具的实用性和易用性。
Tkinter从入门到实战
1321

被折叠的 条评论
为什么被折叠?



