Tkinter 快速入门
Tkinter 是 Python 内置GUI库,无需pip安装,import tkinter as tk 直接用。
适用:小工具、桌面表单、简单窗体程序;不适合大型华丽界面。
1. 最小窗口模板
import tkinter as tk
# 1. 创建主窗口
root = tk.Tk()
root.title("我的窗口") # 窗口标题
root.geometry("600x400") # 窗口大小 宽x高
# 2. 放置组件(按钮、标签、输入框等)
tk.Label(root, text="Hello Tkinter").pack()
# 3. 主消息循环,必须写在最后,启动窗口
root.mainloop()
运行就弹出窗口,所有GUI代码写在mainloop之前。
三大布局管理器(重中之重)
三选一,同一个父容器不要混用多种布局!
- 1.
.pack():简单上下/左右堆叠,适合简单排版 - 2.
.grid():表格网格,你上面的诊断复选框就是用grid,行列布局,最常用表单 - 3.
.place():绝对坐标 x,y,很少用,窗口缩放会乱
pack常用参数
widget.pack(
side="top", # top/bottom/left/right
fill="x", # x横向填满 / y纵向 / both全部填满
expand=True, # 是否抢占剩余空间
padx=10, pady=10# 外边距
)
grid常用参数(你代码在用)
widget.grid(
row=0, column=0, # 行、列,从0开始
sticky="w", # 对齐 n/s/e/w 北南东西;w=靠左,ew=左右拉伸
padx=5, pady=5, # 单元格外边距
)
# 列权重:窗口拉伸时分配多余空间
parent.grid_columnconfigure(0, weight=1)
# 行权重
parent.grid_rowconfigure(0, weight=1)
LabelFrame 带标题分组框(你的诊断区域)
frame = tk.LabelFrame(root, text="分组标题", padx=5,pady=5)
frame.pack(fill="x",pady=5)
# 组件全部放到 frame 里面,第一个参数填父容器
tk.Checkbutton(frame,text="选项1").grid(row=0,column=0)
常用组件速查
1. Label 标签(显示文字)
lab = tk.Label(root, text="显示文字", fg="red", font=("微软雅黑",11))
lab.pack()
# 动态改文字
lab.config(text="新的文字")
2. Button 按钮
defbtn_click():
print("按钮被点击")
btn = tk.Button(root, text="点我", command=btn_click)
btn.pack()
command 传函数名,不要加括号command=btn_click,不要写 btn_click()
3. Entry 单行输入框
var = tk.StringVar()
entry = tk.Entry(root, textvariable=var)
entry.pack()
# 获取值
print(var.get())
# 设置值
var.set("默认内容")
4. Text 多行文本框
text = tk.Text(root, height=6)
text.pack(fill="x")
text.insert("end","写入内容\n") # end代表末尾
content = text.get("1.0", "end") # 获取全部文本,1.0第一行第0字符
text.delete("1.0","end") # 清空
5. Checkbutton 复选框(你的诊断代码)
绑定 BooleanVar,True/False
v = tk.BooleanVar(value=False)
cb = tk.Checkbutton(root, text="选项A", variable=v, command=lambda:print(v.get()))
cb.pack()
⚠️循环创建复选框 lambda闭包陷阱:lambda n=name:func(n)
6. Radiobutton 单选框,绑定StringVar
v = tk.StringVar(value="1")
tk.Radiobutton(root, text="选项1", variable=v, value="1").pack()
tk.Radiobutton(root, text="选项2", variable=v, value="2").pack()
7. Combobox下拉框(需要导入ttk)
from tkinter import ttk
com = ttk.Combobox(root, values=["A","B","C"])
com.pack()
com.set("A")
print(com.get())
Tkinter变量:StringVar,BooleanVar,IntVar,DoubleVar
专门绑定界面控件,界面修改自动同步变量,set()修改变量界面自动刷新
s = tk.StringVar()
i = tk.IntVar()
b = tk.BooleanVar()
面向对象写法(你项目用的 self.xxx)
实际项目,都会封装class,避免全局变量,和你现有代码风格一致
import tkinter as tk
classMyApp:
def__init__(self, root):
self.root = root
self.root.title("面向对象示例")
# 变量加self,全类都可以访问
self.check_var = tk.BooleanVar()
tk.Checkbutton(root,text="测试",variable=self.check_var,command=self.cb_func).pack()
defcb_func(self):
print(self.check_var.get())
if __name__ == "__main__":
r = tk.Tk()
app = MyApp(r)
r.mainloop()
高频踩坑清单
- 1. ❌
command=func() 加括号:程序启动立刻执行函数,点击无效
✅ command=func - 2. ❌循环里lambda闭包:
lambda:func(name),全部取循环最后一个值
✅ lambda n=name:func(n) - 3. ❌grid/pack/place混用在同一个父组件,直接布局错乱
一个父容器只能选一种布局管理器
- 4. ❌窗口拉伸,组件不跟着变大:忘记
grid_columnconfigure(列,weight=1) - 5. ❌Text获取内容直接
text.get(),必须 get("1.0","end") - 6. mainloop() 写前面,窗口一闪而过;mainloop()永远放代码最后