尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

[特殊字符]爆肝整理!Python Tkinter 常用方法大合集,代码注释详细到每一行,收藏这篇就够了!

[特殊字符]爆肝整理!Python Tkinter 常用方法大合集,代码注释详细到每一行,收藏这篇就够了! 前言你是不是也经历过想用 Python 写个带界面的小工具结果对着 Tkinter 官方文档一头雾水控件一大堆方法记不住布局调半天还是歪的……别慌这篇文章就是为你准备的我花了整整两天时间把 Tkinter 最常用的控件和方法梳理了一遍每一段示例代码都加上了详细的注释从窗口创建到事件处理从布局管理到实战小案例应有尽有。看完这篇你也能轻松做出自己的桌面小工具温馨提示文章略长建议先收藏再慢慢看文末还有完整可运行的小项目源码别错过哦~一、Tkinter 简介与第一个窗口Tkinter 是 Python 自带的标准 GUI 库无需额外安装。我们先从最基础的窗口开始。pythonimport 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 标签 —— 显示文字或图片pythonimport tkinter as tk root tk.Tk() root.title(Label示例) root.geometry(300x200) # 创建一个标签设置文字内容、字体、颜色、背景色 label tk.Label( root, # 父容器表示这个标签放在root窗口上 textHello, Tkinter!, # 显示的文字 font(微软雅黑, 16), # 字体和大小元组形式 fgwhite, # 前景色文字颜色 bg#4A90D9, # 背景色 padx20, # 文字左右留白内边距 pady10 # 文字上下留白 ) label.pack() # 将标签放置到窗口上默认从上到下排列 root.mainloop()2. Button 按钮 —— 交互必备pythonimport tkinter as tk root tk.Tk() root.title(Button示例) root.geometry(300x200) count 0 # 点击计数器 def on_click(): 按钮点击时调用的函数 global count count 1 # 修改按钮上的文字 btn.config(textf你点了我 {count} 次) # 创建按钮command参数绑定点击事件的处理函数 btn tk.Button( root, text点我试试, font(微软雅黑, 12), fgwhite, bg#E74C3C, commandon_click, # 注意这里不要加括号传的是函数对象 width15, # 按钮宽度字符数与像素无关 height2 # 按钮高度行数 ) btn.pack(pady30) # pady设置外边距让按钮离上下远一点 root.mainloop()3. Entry 单行输入框pythonimport tkinter as tk root tk.Tk() root.title(Entry示例) root.geometry(350x200) # 定义一个标签提示用户输入 tip tk.Label(root, text请输入你的名字, font(微软雅黑, 12)) tip.pack(pady10) # 创建输入框show参数可以设置显示的字符用于密码输入 entry tk.Entry( root, font(微软雅黑, 12), width25, # 宽度字符数 # show* # 如果取消注释输入内容会显示为*适合密码框 ) entry.pack(pady5) def get_text(): 获取输入框的内容并显示 content entry.get() # get()方法获取输入框当前文字 if content.strip(): # 如果内容不为空去掉首尾空格后 result_label.config(textf你好{content}) else: result_label.config(text请输入名字后再点按钮哦~) # 按钮点击后获取输入框内容 btn tk.Button(root, text打招呼, commandget_text, font(微软雅黑, 11)) btn.pack(pady10) # 用来显示结果的标签 result_label tk.Label(root, text, font(微软雅黑, 12), fg#2C3E50) result_label.pack() root.mainloop()4. Text 多行文本框pythonimport tkinter as tk root tk.Tk() root.title(Text示例) root.geometry(400x300) # 创建多行文本框 text_box tk.Text( root, font(微软雅黑, 11), width40, # 宽度字符数 height10, # 高度行数 wraptk.WORD # 自动换行按单词边界中文也适用 ) text_box.pack(pady10) def show_content(): 获取文本框第1行到第3行的内容 # 获取指定范围的内容1.0表示第1行第0个字符3.end表示第3行末尾 content text_box.get(1.0, 3.end) result_label.config(textf前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行, commandshow_content) show_btn.pack(sidetk.LEFT, padx10) # side控制左右排列 clear_btn tk.Button(btn_frame, text清空, commandclear_all) clear_btn.pack(sidetk.LEFT, padx10) result_label tk.Label(root, text, font(微软雅黑, 10), fgpurple) result_label.pack(pady10) root.mainloop()5. Checkbutton 多选框 Radiobutton 单选框pythonimport tkinter as tk root tk.Tk() root.title(选择控件示例) root.geometry(350x300) # ---- 多选框示例 ---- tk.Label(root, text选择你的爱好多选, font(微软雅黑, 12)).pack(anchorw, padx20, pady10) # 每个复选框需要一个变量来保存其选中状态 hobby1_var tk.IntVar() # 0为未选中1为选中 hobby2_var tk.IntVar() hobby3_var tk.IntVar() tk.Checkbutton(root, text篮球, variablehobby1_var, font(微软雅黑, 11)).pack(anchorw, padx40) tk.Checkbutton(root, text编程, variablehobby2_var, font(微软雅黑, 11)).pack(anchorw, padx40) tk.Checkbutton(root, text睡觉, variablehobby3_var, font(微软雅黑, 11)).pack(anchorw, padx40) # ---- 单选框示例 ---- tk.Label(root, text选择你的学历, font(微软雅黑, 12)).pack(anchorw, padx20, pady(15,5)) edu_var tk.StringVar(value本科) # 单选框组共享一个变量设置默认选中值 edu_options [高中, 本科, 硕士, 博士] for opt in edu_options: tk.Radiobutton( root, textopt, variableedu_var, # 同一组的variable必须相同 valueopt, # 选中时变量的值 font(微软雅黑, 11) ).pack(anchorw, padx40) 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(textf爱好{hobbies} 学历{education}) tk.Button(root, text提交, commandshow_choices, font(微软雅黑, 12), bg#27AE60, fgwhite).pack(pady15) result_label tk.Label(root, text, font(微软雅黑, 11), fg#8E44AD) result_label.pack() root.mainloop()三、布局管理三剑客pack、grid、place布局是 GUI 的灵魂Tkinter 有三种布局方式掌握它们才能把控件摆得漂亮。1. pack —— 相对定位从上到下/从左到右pythonimport tkinter as tk root tk.Tk() root.title(pack布局) root.geometry(300x250) # side控制排列方向fill控制填充expand控制是否扩展占满额外空间 tk.Label(root, text上, bglightblue).pack(sidetk.TOP, filltk.X) # 填充水平方向 tk.Label(root, text下, bglightgreen).pack(sidetk.BOTTOM, filltk.X) # 左右排列并让它们垂直方向扩展 left tk.Label(root, text左, bgpink) left.pack(sidetk.LEFT, filltk.Y, expandTrue) # expandTrue让控件占据剩余空间 right tk.Label(root, text右, bgorange) right.pack(sidetk.RIGHT, filltk.Y, expandTrue) root.mainloop()2. grid —— 表格布局最灵活推荐pythonimport tkinter as tk root tk.Tk() root.title(grid布局 - 简易登录界面) root.geometry(300x200) # 用户名行 tk.Label(root, text用户名, font(微软雅黑, 11)).grid(row0, column0, padx10, pady10, stickye) entry_user tk.Entry(root, font(微软雅黑, 11)) entry_user.grid(row0, column1, padx10, pady10) # 密码行 tk.Label(root, text密 码, font(微软雅黑, 11)).grid(row1, column0, padx10, pady10, stickye) entry_pwd tk.Entry(root, font(微软雅黑, 11), show*) entry_pwd.grid(row1, column1, padx10, pady10) # 登录按钮跨两列合并居中 login_btn tk.Button(root, text登录, font(微软雅黑, 12), bg#3498DB, fgwhite, width20) login_btn.grid(row2, column0, columnspan2, pady20) # columnspan让按钮占两列 root.mainloop()3. place —— 绝对定位精确到像素pythonimport tkinter as tk root tk.Tk() root.title(place布局) root.geometry(300x200) # 使用 x, y 绝对坐标放置控件左上角为原点 tk.Label(root, text我在(20,30), bgyellow).place(x20, y30) tk.Label(root, text我在(150,100), bgcyan).place(x150, y100) # 可以使用相对位置比如居中 center_btn tk.Button(root, text居中按钮, bglightgray) # relx/rely为0.5表示父容器的中心anchortk.CENTER让控件中心对准该点 center_btn.place(relx0.5, rely0.5, anchortk.CENTER) root.mainloop()小结简单界面用pack规整表单用grid需要精确控制位置或做动画时用place。实际开发中grid用得最多。四、事件处理与交互除了按钮的commandTkinter 还能绑定键盘、鼠标等各种事件。pythonimport tkinter as tk root tk.Tk() root.title(事件绑定示例) root.geometry(400x350) # 创建一个标签用于显示事件信息 info_label tk.Label(root, text请尝试点击/按键/移动鼠标, font(微软雅黑, 11), fggray) info_label.pack(pady10) # 绑定键盘事件 def on_key(event): 键盘按下事件event对象包含按键信息 info_label.config(textf你按下了键盘{event.char} (键码: {event.keycode})) root.bind(KeyPress, on_key) # 绑定到整个窗口任何按键都会触发 # 绑定鼠标点击事件 def on_click(event): 鼠标点击事件可以获取点击坐标 info_label.config(textf鼠标{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(textf鼠标位置({event.x}, {event.y})) motion_label tk.Label(root, text鼠标位置, font(微软雅黑, 10)) motion_label.pack(pady5) root.bind(Motion, on_motion) # 鼠标移动 # 绑定窗口关闭事件拦截关闭按钮 def on_close(): 自定义关闭窗口时的操作 if tk.messagebox.askokcancel(退出, 确定要退出程序吗): root.destroy() # 真正销毁窗口 root.protocol(WM_DELETE_WINDOW, on_close) # 点击X时触发 root.mainloop()五、实战小案例备忘录小程序综合运用所学我们写一个简单的备忘录可以添加待办事项标记完成删除事项。pythonimport 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(pady10) entry tk.Entry(top_frame, font(微软雅黑, 12), width25) entry.pack(sidetk.LEFT, padx5) add_btn tk.Button(top_frame, text添加任务, commandadd_task, font(微软雅黑, 10), bg#2ECC71, fgwhite, width10) add_btn.pack(sidetk.LEFT) # 中间任务列表Listbox控件 list_frame tk.Frame(root) list_frame.pack(pady10) scrollbar tk.Scrollbar(list_frame) # 滚动条 scrollbar.pack(sidetk.RIGHT, filltk.Y) task_list tk.Listbox( list_frame, font(微软雅黑, 11), width40, height15, selectmodetk.SINGLE, # 单选模式 yscrollcommandscrollbar.set # 关联滚动条 ) task_list.pack(sidetk.LEFT, filltk.BOTH) scrollbar.config(commandtask_list.yview) # 滚动条控制列表 # 底部操作按钮 btn_frame tk.Frame(root) btn_frame.pack(pady10) mark_btn tk.Button(btn_frame, text标记完成, commandmark_done, font(微软雅黑, 10), bg#3498DB, fgwhite, width10) mark_btn.pack(sidetk.LEFT, padx5) delete_btn tk.Button(btn_frame, text删除任务, commanddelete_task, font(微软雅黑, 10), bg#E74C3C, fgwhite, width10) delete_btn.pack(sidetk.LEFT, padx5) clear_btn tk.Button(btn_frame, text清空所有, commandclear_all_tasks, font(微软雅黑, 10), bg#95A5A6, fgwhite, width10) clear_btn.pack(sidetk.LEFT, padx5) # 运行主循环 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 绘图、数据库结合等。关注我不迷路
返回列表