Tkinter - Python GUI 开发
一、Tkinter 简介
Tkinter 是 Python 标准库自带的 GUI(图形用户界面)开发工具包,基于 Tcl/Tk 构建。安装 Python 后即可直接使用,无需额外安装。Python 3 中包名为 tkinter(全小写)。
适用场景:小型工具、内部应用、原型验证、脚本可视化等。跨平台支持 Windows/macOS/Linux。
二、环境准备
检查 Tkinter 是否可用,在终端执行:
python3 -m tkinter
如果弹出测试窗口,说明已就绪。
Linux(Ubuntu/Debian)若未安装:
sudo apt install python3-tk
三、第一个窗口
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("我的第一个窗口") # 窗口标题
root.geometry("300x200") # 宽x高
# 创建标签
label = tk.Label(root, text="你好,Tkinter!", font=("微软雅黑", 16))
label.pack(pady=20)
# 创建按钮
button = tk.Button(root, text="退出", command=root.destroy)
button.pack()
# 启动事件循环(必须调用)
root.mainloop()
核心三步:创建根窗口 → 添加组件 → 调用 mainloop() 启动事件循环。
四、常用组件
| 组件 | 用途 | 关键参数 |
|---|---|---|
Label |
显示文本或图片 | text, font, fg, bg |
Button |
可点击按钮 | text, command |
Entry |
单行文本输入 | textvariable, show |
Text |
多行文本编辑 | - |
Frame |
容器,用于组织其他组件 | relief, bd |
Listbox |
列表选择 | listvariable, selectmode |
Canvas |
绘图区域 | - |
ttk 模块提供更美观的组件(如 Combobox、Treeview):
from tkinter import ttk
combo = ttk.Combobox(root, values=["选项1", "选项2"])
五、布局管理
Tkinter 提供三种布局管理器:
1. pack() — 顺序排列
按添加顺序自上而下排列。
btn1.pack(side='left', padx=5) # 水平排列
btn2.pack(fill='x', pady=5) # 水平填充
常用参数:side(方向)、fill(填充)、padx/pady(外边距)。
2. grid() — 网格布局(推荐)
以行列表格形式精准定位,表单类界面首选。
label = tk.Label(root, text="用户名:")
label.grid(row=0, column=0, sticky='e') # sticky='e' 右对齐
entry = tk.Entry(root)
entry.grid(row=0, column=1, sticky='ew') # 水平拉伸
3. place() — 绝对定位
指定精确坐标。
widget.place(x=100, y=200, anchor='nw')
最佳实践:优先用 grid 实现复杂布局,用 Frame 容器组织组件。
六、事件处理
方式一:Button 的 command 参数(最简单)
def on_click():
print("按钮被点击了")
btn = tk.Button(root, text="点击", command=on_click)
方式二:bind() 方法(更灵活)
def callback(event):
print(f"点击坐标: {event.x}, {event.y}")
widget.bind("<Button-1>", callback) # 鼠标左键点击
常用事件类型:
| 事件 | 说明 |
|---|---|
<Button-1> |
鼠标左键单击 |
<Button-3> |
鼠标右键单击 |
<Double-Button-1> |
鼠标左键双击 |
<KeyPress-A> |
按下 A 键 |
<Return> |
回车键 |
<Enter> / <Leave> |
鼠标进入/离开控件 |
<Configure> |
窗口尺寸变化 |
七、完整示例:登录窗口
import tkinter as tk
from tkinter import messagebox
def login():
if entry_user.get() == "admin" and entry_pass.get() == "123456":
messagebox.showinfo("成功", "登录成功!")
else:
messagebox.showerror("错误", "账号或密码错误")
root = tk.Tk()
root.title("登录")
root.geometry("250x150")
# 用户名
tk.Label(root, text="用户名:").grid(row=0, column=0, sticky='e', padx=5, pady=5)
entry_user = tk.Entry(root)
entry_user.grid(row=0, column=1, padx=5, pady=5)
# 密码
tk.Label(root, text="密码:").grid(row=1, column=0, sticky='e', padx=5, pady=5)
entry_pass = tk.Entry(root, show="*") # show="*" 隐藏密码
entry_pass.grid(row=1, column=1, padx=5, pady=5)
# 登录按钮
btn = tk.Button(root, text="登录", command=login)
btn.grid(row=2, column=0, columnspan=2, pady=10) # columnspan 跨两列
root.mainloop()
八、学习资源
- 官方文档:tkinter — Python interface to Tcl/Tk
- TkDocs:全面的 Tkinter 教程,推荐现代 API
- Tkinter 8.5 参考:详细的类和方法文档
提示:Tcl/Tk 8.5(2007年)引入了现代主题组件,网上的旧教程可能已过时,建议优先参考 TkDocs 等现代文档。

浙公网安备 33010602011771号