[特殊字符]爆肝整理!Python Tkinter 常用方法大合集,代码注释详细到每一行,收藏这篇就够了!
前言
你是不是也经历过:想用 Python 写个带界面的小工具,结果对着 Tkinter 官方文档一头雾水?控件一大堆,方法记不住,布局调半天还是歪的……别慌,这篇文章就是为你准备的!
我花了整整两天时间,把 Tkinter 最常用的控件和方法梳理了一遍,每一段示例代码都加上了详细的注释,从窗口创建到事件处理,从布局管理到实战小案例,应有尽有。看完这篇,你也能轻松做出自己的桌面小工具!
温馨提示:文章略长,建议先收藏再慢慢看,文末还有完整可运行的小项目源码,别错过哦~
一、Tkinter 简介与第一个窗口
Tkinter 是 Python 自带的标准 GUI 库,无需额外安装。我们先从最基础的窗口开始。
python
import tkinter as tk # 导入tkinter,简写为tk # 1. 创建主窗口 root = tk.Tk() # Tk() 是主窗口对象,一切控件的根 root.title("我的第一个窗口") # 设置窗口标题 root.geometry("400x300") # 设置窗口大小 宽x高,中间是小写字母x root.resizable(False, False) # 禁止用户调整窗口大小(宽不可调,高不可调) # 2. 进入消息循环(必须放在最后,否则窗口一闪而过) root.mainloop() # 让窗口一直显示,等待用户操作运行上面代码,一个 400×300 的不可调整大小的窗口就诞生了。
二、最常用控件大盘点(带注释示例)
1. Label 标签 —— 显示文字或图片
python
import tkinter as tk root = tk.Tk() root.title("Label示例") root.geometry("300x200") # 创建一个标签,设置文字内容、字体、颜色、背景色 label = tk.Label( root, # 父容器,表示这个标签放在root窗口上 text="Hello, Tkinter!", # 显示的文字 font=("微软雅黑", 16), # 字体和大小,元组形式 fg="white", # 前景色(文字颜色) bg="#4A90D9", # 背景色 padx=20, # 文字左右留白(内边距) pady=10 # 文字上下留白 ) label.pack() # 将标签放置到窗口上,默认从上到下排列 root.mainloop()2. Button 按钮 —— 交互必备
python
import tkinter as tk root = tk.Tk() root.title("Button示例") root.geometry("300x200") count = 0 # 点击计数器 def on_click(): """按钮点击时调用的函数""" global count count += 1 # 修改按钮上的文字 btn.config(text=f"你点了我 {count} 次") # 创建按钮,command参数绑定点击事件的处理函数 btn = tk.Button( root, text="点我试试", font=("微软雅黑", 12), fg="white", bg="#E74C3C", command=on_click, # 注意:这里不要加括号,传的是函数对象 width=15, # 按钮宽度(字符数,与像素无关) height=2 # 按钮高度(行数) ) btn.pack(pady=30) # pady设置外边距,让按钮离上下远一点 root.mainloop()3. Entry 单行输入框
python
import tkinter as tk root = tk.Tk() root.title("Entry示例") root.geometry("350x200") # 定义一个标签提示用户输入 tip = tk.Label(root, text="请输入你的名字:", font=("微软雅黑", 12)) tip.pack(pady=10) # 创建输入框,show参数可以设置显示的字符(用于密码输入) entry = tk.Entry( root, font=("微软雅黑", 12), width=25, # 宽度(字符数) # show="*" # 如果取消注释,输入内容会显示为*,适合密码框 ) entry.pack(pady=5) def get_text(): """获取输入框的内容并显示""" content = entry.get() # get()方法获取输入框当前文字 if content.strip(): # 如果内容不为空(去掉首尾空格后) result_label.config(text=f"你好,{content}!") else: result_label.config(text="请输入名字后再点按钮哦~") # 按钮,点击后获取输入框内容 btn = tk.Button(root, text="打招呼", command=get_text, font=("微软雅黑", 11)) btn.pack(pady=10) # 用来显示结果的标签 result_label = tk.Label(root, text="", font=("微软雅黑", 12), fg="#2C3E50") result_label.pack() root.mainloop()4. Text 多行文本框
python
import tkinter as tk root = tk.Tk() root.title("Text示例") root.geometry("400x300") # 创建多行文本框 text_box = tk.Text( root, font=("微软雅黑", 11), width=40, # 宽度(字符数) height=10, # 高度(行数) wrap=tk.WORD # 自动换行按单词边界(中文也适用) ) text_box.pack(pady=10) def show_content(): """获取文本框第1行到第3行的内容""" # 获取指定范围的内容,"1.0"表示第1行第0个字符,"3.end"表示第3行末尾 content = text_box.get("1.0", "3.end") result_label.config(text=f"前3行内容:{content}") def clear_all(): """清空文本框""" text_box.delete("1.0", tk.END) # 从第1行第0列删除到末尾 # 按钮框架 btn_frame = tk.Frame(root) btn_frame.pack() show_btn = tk.Button(btn_frame, text="显示前3行", command=show_content) show_btn.pack(side=tk.LEFT, padx=10) # side控制左右排列 clear_btn = tk.Button(btn_frame, text="清空", command=clear_all) clear_btn.pack(side=tk.LEFT, padx=10) result_label = tk.Label(root, text="", font=("微软雅黑", 10), fg="purple") result_label.pack(pady=10) root.mainloop()5. Checkbutton 多选框 + Radiobutton 单选框
python
import tkinter as tk root = tk.Tk() root.title("选择控件示例") root.geometry("350x300") # ---- 多选框示例 ---- tk.Label(root, text="选择你的爱好(多选):", font=("微软雅黑", 12)).pack(anchor='w', padx=20, pady=10) # 每个复选框需要一个变量来保存其选中状态 hobby1_var = tk.IntVar() # 0为未选中,1为选中 hobby2_var = tk.IntVar() hobby3_var = tk.IntVar() tk.Checkbutton(root, text="篮球", variable=hobby1_var, font=("微软雅黑", 11)).pack(anchor='w', padx=40) tk.Checkbutton(root, text="编程", variable=hobby2_var, font=("微软雅黑", 11)).pack(anchor='w', padx=40) tk.Checkbutton(root, text="睡觉", variable=hobby3_var, font=("微软雅黑", 11)).pack(anchor='w', padx=40) # ---- 单选框示例 ---- tk.Label(root, text="选择你的学历:", font=("微软雅黑", 12)).pack(anchor='w', padx=20, pady=(15,5)) edu_var = tk.StringVar(value="本科") # 单选框组共享一个变量,设置默认选中值 edu_options = ["高中", "本科", "硕士", "博士"] for opt in edu_options: tk.Radiobutton( root, text=opt, variable=edu_var, # 同一组的variable必须相同 value=opt, # 选中时变量的值 font=("微软雅黑", 11) ).pack(anchor='w', padx=40) def show_choices(): """获取多选和单选的结果""" hobbies = [] if hobby1_var.get() == 1: hobbies.append("篮球") if hobby2_var.get() == 1: hobbies.append("编程") if hobby3_var.get() == 1: hobbies.append("睡觉") education = edu_var.get() result_label.config(text=f"爱好:{hobbies} 学历:{education}") tk.Button(root, text="提交", command=show_choices, font=("微软雅黑", 12), bg="#27AE60", fg="white").pack(pady=15) result_label = tk.Label(root, text="", font=("微软雅黑", 11), fg="#8E44AD") result_label.pack() root.mainloop()三、布局管理三剑客:pack、grid、place
布局是 GUI 的灵魂,Tkinter 有三种布局方式,掌握它们才能把控件摆得漂亮。
1. pack —— 相对定位(从上到下/从左到右)
python
import tkinter as tk root = tk.Tk() root.title("pack布局") root.geometry("300x250") # side控制排列方向,fill控制填充,expand控制是否扩展占满额外空间 tk.Label(root, text="上", bg="lightblue").pack(side=tk.TOP, fill=tk.X) # 填充水平方向 tk.Label(root, text="下", bg="lightgreen").pack(side=tk.BOTTOM, fill=tk.X) # 左右排列,并让它们垂直方向扩展 left = tk.Label(root, text="左", bg="pink") left.pack(side=tk.LEFT, fill=tk.Y, expand=True) # expand=True让控件占据剩余空间 right = tk.Label(root, text="右", bg="orange") right.pack(side=tk.RIGHT, fill=tk.Y, expand=True) root.mainloop()2. grid —— 表格布局(最灵活,推荐)
python
import tkinter as tk root = tk.Tk() root.title("grid布局 - 简易登录界面") root.geometry("300x200") # 用户名行 tk.Label(root, text="用户名:", font=("微软雅黑", 11)).grid(row=0, column=0, padx=10, pady=10, sticky="e") entry_user = tk.Entry(root, font=("微软雅黑", 11)) entry_user.grid(row=0, column=1, padx=10, pady=10) # 密码行 tk.Label(root, text="密 码:", font=("微软雅黑", 11)).grid(row=1, column=0, padx=10, pady=10, sticky="e") entry_pwd = tk.Entry(root, font=("微软雅黑", 11), show="*") entry_pwd.grid(row=1, column=1, padx=10, pady=10) # 登录按钮(跨两列合并居中) login_btn = tk.Button(root, text="登录", font=("微软雅黑", 12), bg="#3498DB", fg="white", width=20) login_btn.grid(row=2, column=0, columnspan=2, pady=20) # columnspan让按钮占两列 root.mainloop()3. place —— 绝对定位(精确到像素)
python
import tkinter as tk root = tk.Tk() root.title("place布局") root.geometry("300x200") # 使用 x, y 绝对坐标放置控件(左上角为原点) tk.Label(root, text="我在(20,30)", bg="yellow").place(x=20, y=30) tk.Label(root, text="我在(150,100)", bg="cyan").place(x=150, y=100) # 可以使用相对位置,比如居中 center_btn = tk.Button(root, text="居中按钮", bg="lightgray") # relx/rely为0.5表示父容器的中心,anchor=tk.CENTER让控件中心对准该点 center_btn.place(relx=0.5, rely=0.5, anchor=tk.CENTER) root.mainloop()小结:简单界面用pack,规整表单用grid,需要精确控制位置或做动画时用place。实际开发中grid用得最多。
四、事件处理与交互
除了按钮的command,Tkinter 还能绑定键盘、鼠标等各种事件。
python
import tkinter as tk root = tk.Tk() root.title("事件绑定示例") root.geometry("400x350") # 创建一个标签,用于显示事件信息 info_label = tk.Label(root, text="请尝试点击/按键/移动鼠标", font=("微软雅黑", 11), fg="gray") info_label.pack(pady=10) # 绑定键盘事件 def on_key(event): """键盘按下事件,event对象包含按键信息""" info_label.config(text=f"你按下了键盘:{event.char} (键码: {event.keycode})") root.bind("<KeyPress>", on_key) # 绑定到整个窗口,任何按键都会触发 # 绑定鼠标点击事件 def on_click(event): """鼠标点击事件,可以获取点击坐标""" info_label.config(text=f"鼠标{event.num}键点击在:({event.x}, {event.y})") root.bind("<Button-1>", lambda e: on_click(e)) # 左键点击 root.bind("<Button-3>", lambda e: on_click(e)) # 右键点击 # 绑定鼠标移动事件 def on_motion(event): """鼠标移动时实时显示坐标""" motion_label.config(text=f"鼠标位置:({event.x}, {event.y})") motion_label = tk.Label(root, text="鼠标位置:", font=("微软雅黑", 10)) motion_label.pack(pady=5) root.bind("<Motion>", on_motion) # 鼠标移动 # 绑定窗口关闭事件(拦截关闭按钮) def on_close(): """自定义关闭窗口时的操作""" if tk.messagebox.askokcancel("退出", "确定要退出程序吗?"): root.destroy() # 真正销毁窗口 root.protocol("WM_DELETE_WINDOW", on_close) # 点击X时触发 root.mainloop()五、实战小案例:备忘录小程序
综合运用所学,我们写一个简单的备忘录:可以添加待办事项,标记完成,删除事项。
python
import tkinter as tk from tkinter import messagebox # ================== 主窗口 ================== root = tk.Tk() root.title("我的备忘录") root.geometry("450x500") root.resizable(False, False) # ================== 功能函数 ================== def add_task(): """添加新任务到列表""" task = entry.get().strip() if task: # 插入到Listbox末尾 task_list.insert(tk.END, task) entry.delete(0, tk.END) # 清空输入框 else: messagebox.showwarning("提示", "任务不能为空!") def mark_done(): """将选中的任务标记为完成(前面加上✓)""" try: selected = task_list.curselection()[0] # 获取选中项的索引 task_text = task_list.get(selected) if not task_text.startswith("✓ "): task_list.delete(selected) task_list.insert(selected, f"✓ {task_text}") task_list.itemconfig(selected, {'fg':'gray'}) # 文字变灰 except IndexError: messagebox.showwarning("提示", "请先选择一项任务!") def delete_task(): """删除选中的任务""" try: selected = task_list.curselection()[0] task_list.delete(selected) except IndexError: messagebox.showwarning("提示", "请先选择一项任务!") def clear_all_tasks(): """清空所有任务""" if messagebox.askyesno("确认", "确定要清空所有任务吗?"): task_list.delete(0, tk.END) # ================== 界面布局 ================== # 顶部:输入框 + 添加按钮 top_frame = tk.Frame(root) top_frame.pack(pady=10) entry = tk.Entry(top_frame, font=("微软雅黑", 12), width=25) entry.pack(side=tk.LEFT, padx=5) add_btn = tk.Button(top_frame, text="添加任务", command=add_task, font=("微软雅黑", 10), bg="#2ECC71", fg="white", width=10) add_btn.pack(side=tk.LEFT) # 中间:任务列表(Listbox控件) list_frame = tk.Frame(root) list_frame.pack(pady=10) scrollbar = tk.Scrollbar(list_frame) # 滚动条 scrollbar.pack(side=tk.RIGHT, fill=tk.Y) task_list = tk.Listbox( list_frame, font=("微软雅黑", 11), width=40, height=15, selectmode=tk.SINGLE, # 单选模式 yscrollcommand=scrollbar.set # 关联滚动条 ) task_list.pack(side=tk.LEFT, fill=tk.BOTH) scrollbar.config(command=task_list.yview) # 滚动条控制列表 # 底部:操作按钮 btn_frame = tk.Frame(root) btn_frame.pack(pady=10) mark_btn = tk.Button(btn_frame, text="标记完成", command=mark_done, font=("微软雅黑", 10), bg="#3498DB", fg="white", width=10) mark_btn.pack(side=tk.LEFT, padx=5) delete_btn = tk.Button(btn_frame, text="删除任务", command=delete_task, font=("微软雅黑", 10), bg="#E74C3C", fg="white", width=10) delete_btn.pack(side=tk.LEFT, padx=5) clear_btn = tk.Button(btn_frame, text="清空所有", command=clear_all_tasks, font=("微软雅黑", 10), bg="#95A5A6", fg="white", width=10) clear_btn.pack(side=tk.LEFT, padx=5) # 运行主循环 root.mainloop()这个小工具已经具备了增、删、标记完成、清空等基础功能,你可以继续拓展:保存到文件、设置截止时间、提醒弹窗等。
六、一些新手避坑指南
别忘了
mainloop():它是事件循环,缺少它窗口会瞬间消失。command传函数不要加括号:加括号会在程序启动时直接调用该函数。变量要用
StringVar/IntVar:用在需要动态改变控件内容的场景,如Entry、Checkbutton等。布局不要混用:同一个父容器里,
pack和grid不要混用,否则 Tkinter 会无限计算尺寸导致卡死。多线程问题:Tkinter 不是线程安全的,耗时操作要用
after()或子线程+队列方式更新界面。
七、总结
本文从零开始,讲解了 Tkinter 的:
基础窗口创建
常用控件(Label、Button、Entry、Text、Checkbutton、Radiobutton 等)
三种布局方式(pack、grid、place)
事件绑定
实战备忘录项目
每一段代码都加了逐行注释,力求让新手也能看懂。如果你觉得有用,不妨点个赞、收藏一下,以后用到时就能快速找回。
后续我还会更新 Tkinter 进阶内容:菜单栏、对话框、Canvas 绘图、数据库结合等。关注我,不迷路!
