当前位置: 首页 > news >正文

Tkinter GUI 编程教程

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发
❄️作者主页:一个平凡而乐于分享的小比特的个人主页
✨收录专栏:Python,本专栏为记录项目中用到常用python库
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

Tkinter GUI 编程教程

Tkinter 是 Python 的标准 GUI 库,可以快速创建图形用户界面。本教程将带你从基础开始学习 Tkinter。

1. Tkinter 简介

Tkinter 是 Python 自带的 GUI 工具包,基于 Tk GUI 工具集。它的优点包括:

  • 跨平台(Windows、macOS、Linux)
  • 简单易学
  • 无需额外安装

2. 第一个 Tkinter 程序

importtkinterastk# 创建主窗口root=tk.Tk()root.title("我的第一个 Tkinter 程序")root.geometry("300x200")# 设置窗口大小# 创建标签label=tk.Label(root,text="Hello, Tkinter!")label.pack()# 将标签添加到窗口# 创建按钮defon_click():label.config(text="按钮被点击了!")button=tk.Button(root,text="点击我",command=on_click)button.pack()# 启动主循环root.mainloop()

3. 窗口和基础组件

3.1 创建窗口

importtkinterastk root=tk.Tk()root.title("窗口标题")root.geometry("400x300")# 宽度x高度root.resizable(True,False)# 宽度可调整,高度不可调整root.iconbitmap("icon.ico")# 设置窗口图标(仅Windows)root.configure(bg="lightblue")# 设置背景颜色

3.2 常用组件

importtkinterastkfromtkinterimportmessagebox root=tk.Tk()root.title("基础组件演示")root.geometry("400x400")# 1. 标签label=tk.Label(root,text="这是一个标签",font=("Arial",12),fg="blue")label.pack(pady=10)# 2. 按钮defbutton_click():messagebox.showinfo("提示","按钮被点击了!")button=tk.Button(root,text="点击我",command=button_click,bg="lightgreen")button.pack(pady=10)# 3. 输入框entry=tk.Entry(root,width=30)entry.insert(0,"默认文本")# 设置默认文本entry.pack(pady=10)# 4. 文本框text=tk.Text(root,height=5,width=30)text.insert("1.0","这是一个多行文本框\n可以输入多行文本")text.pack(pady=10)# 5. 复选框check_var=tk.IntVar()checkbutton=tk.Checkbutton(root,text="选择我",variable=check_var)checkbutton.pack(pady=10)# 6. 单选框radio_var=tk.StringVar(value="选项1")radio1=tk.Radiobutton(root,text="选项1",variable=radio_var,value="选项1")radio2=tk.Radiobutton(root,text="选项2",variable=radio_var,value="选项2")radio1.pack()radio2.pack()root.mainloop()

4. 布局管理

Tkinter 有三种布局管理器:pack、grid 和 place。

4.1 pack 布局

importtkinterastk root=tk.Tk()root.title("pack 布局")root.geometry("300x200")# pack 按照添加顺序排列组件tk.Label(root,text="标签1",bg="red").pack(fill=tk.X,padx=10,pady=5)tk.Label(root,text="标签2",bg="green").pack(fill=tk.X,padx=10,pady=5)tk.Label(root,text="标签3",bg="blue").pack(fill=tk.X,padx=10,pady=5)# side 参数控制方向tk.Button(root,text="左").pack(side=tk.LEFT,padx=5)tk.Button(root,text="右").pack(side=tk.RIGHT,padx=5)tk.Button(root,text="顶部").pack(side=tk.TOP,pady=5)tk.Button(root,text="底部").pack(side=tk.BOTTOM,pady=5)root.mainloop()

4.2 grid 布局(最常用)

importtkinterastk root=tk.Tk()root.title("grid 布局")root.geometry("300x200")# 使用 grid 布局,类似表格tk.Label(root,text="用户名:").grid(row=0,column=0,padx=10,pady=10,sticky=tk.W)tk.Entry(root).grid(row=0,column=1,padx=10,pady=10)tk.Label(root,text="密码:").grid(row=1,column=0,padx=10,pady=10,sticky=tk.W)tk.Entry(root,show="*").grid(row=1,column=1,padx=10,pady=10)# 跨列显示按钮tk.Button(root,text="登录").grid(row=2,column=0,columnspan=2,pady=20,sticky=tk.EW)# 配置列权重,使第二列可以伸缩root.grid_columnconfigure(1,weight=1)root.mainloop()

4.3 place 布局(精确位置)

importtkinterastk root=tk.Tk()root.title("place 布局")root.geometry("300x200")# 使用绝对坐标放置组件tk.Label(root,text="绝对定位",bg="yellow").place(x=50,y=50)# 使用相对位置tk.Label(root,text="相对定位",bg="lightblue").place(relx=0.5,rely=0.5,anchor=tk.CENTER)root.mainloop()

5. 事件处理

importtkinterastkfromtkinterimportmessagebox root=tk.Tk()root.title("事件处理")root.geometry("400x300")# 1. 按钮点击事件defbutton_click():messagebox.showinfo("事件","按钮被点击")button=tk.Button(root,text="点击事件",command=button_click)button.pack(pady=10)# 2. 键盘事件defon_key_press(event):print(f"按下了键:{event.char}")label.config(text=f"按下了:{event.char}")label=tk.Label(root,text="按任意键")label.pack(pady=10)root.bind("<Key>",on_key_press)# 3. 鼠标事件defon_click(event):print(f"鼠标点击位置: ({event.x},{event.y})")canvas=tk.Canvas(root,width=200,height=100,bg="lightgray")canvas.pack(pady=10)canvas.bind("<Button-1>",on_click)# 左键点击# 4. 输入框事件defon_entry_change(event):print(f"输入框内容:{entry.get()}")entry=tk.Entry(root,width=30)entry.pack(pady=10)entry.bind("<KeyRelease>",on_entry_change)# 键盘释放时触发root.mainloop()

6. 高级组件

importtkinterastkfromtkinterimportttk,messagebox,filedialog root=tk.Tk()root.title("高级组件")root.geometry("500x400")# 1. 下拉菜单defon_menu_select(event):messagebox.showinfo("选择",f"选择了:{combo.get()}")combo=ttk.Combobox(root,values=["选项1","选项2","选项3"])combo.set("请选择")combo.pack(pady=10)combo.bind("<<ComboboxSelected>>",on_menu_select)# 2. 列表框listbox=tk.Listbox(root,height=4)foritemin["项目1","项目2","项目3","项目4","项目5"]:listbox.insert(tk.END,item)listbox.pack(pady=10)defshow_selected():selected=listbox.curselection()ifselected:messagebox.showinfo("选择",f"选择了:{listbox.get(selected[0])}")tk.Button(root,text="显示选中项",command=show_selected).pack(pady=5)# 3. 滚动条frame=tk.Frame(root)frame.pack(pady=10)text=tk.Text(frame,height=5,width=40)scrollbar=tk.Scrollbar(frame,command=text.yview)text.configure(yscrollcommand=scrollbar.set)text.pack(side=tk.LEFT)scrollbar.pack(side=tk.RIGHT,fill=tk.Y)# 4. 进度条progress=ttk.Progressbar(root,length=200,mode='indeterminate')progress.pack(pady=10)defstart_progress():progress.start(10)defstop_progress():progress.stop()tk.Button(root,text="开始进度",command=start_progress).pack(pady=5)tk.Button(root,text="停止进度",command=stop_progress).pack(pady=5)# 5. 文件对话框defopen_file():filepath=filedialog.askopenfilename(title="选择文件",filetypes=[("文本文件","*.txt"),("所有文件","*.*")])iffilepath:messagebox.showinfo("文件",f"选择了:{filepath}")tk.Button(root,text="打开文件",command=open_file).pack(pady=10)root.mainloop()

7. 综合示例

创建一个简单的待办事项应用:

importtkinterastkfromtkinterimportttk,messageboxfromdatetimeimportdatetimeclassTodoApp:def__init__(self,root):self.root=root self.root.title("待办事项管理")self.root.geometry("500x400")self.tasks=[]self.setup_ui()defsetup_ui(self):# 创建框架input_frame=tk.Frame(self.root)input_frame.pack(pady=10,padx=10,fill=tk.X)# 输入框和添加按钮tk.Label(input_frame,text="新任务:").pack(side=tk.LEFT,padx=(0,10))self.task_entry=tk.Entry(input_frame,width=30)self.task_entry.pack(side=tk.LEFT,padx=(0,10))self.task_entry.bind("<Return>",lambdae:self.add_task())tk.Button(input_frame,text="添加",command=self.add_task,bg="lightgreen").pack(side=tk.LEFT)# 任务列表list_frame=tk.Frame(self.root)list_frame.pack(pady=10,padx=10,fill=tk.BOTH,expand=True)# 创建树形视图显示任务columns=("序号","任务","创建时间","状态")self.tree=ttk.Treeview(list_frame,columns=columns,show="headings",height=10)forcolincolumns:self.tree.heading(col,text=col)self.tree.column(col,width=100)self.tree.column("任务",width=200)# 添加滚动条scrollbar=ttk.Scrollbar(list_frame,orient=tk.VERTICAL,command=self.tree.yview)self.tree.configure(yscrollcommand=scrollbar.set)self.tree.pack(side=tk.LEFT,fill=tk.BOTH,expand=True)scrollbar.pack(side=tk.RIGHT,fill=tk.Y)# 操作按钮button_frame=tk.Frame(self.root)button_frame.pack(pady=10)tk.Button(button_frame,text="标记完成",command=self.complete_task,bg="lightblue").pack(side=tk.LEFT,padx=5)tk.Button(button_frame,text="删除任务",command=self.delete_task,bg="lightcoral").pack(side=tk.LEFT,padx=5)tk.Button(button_frame,text="清空全部",command=self.clear_all,bg="orange").pack(side=tk.LEFT,padx=5)# 状态标签self.status_label=tk.Label(self.root,text="总任务数: 0",relief=tk.SUNKEN,anchor=tk.W)self.status_label.pack(side=tk.BOTTOM,fill=tk.X)defadd_task(self):task_text=self.task_entry.get().strip()iftask_text:task_id=len(self.tasks)+1create_time=datetime.now().strftime("%H:%M:%S")self.tasks.append({"id":task_id,"text":task_text,"time":create_time,"status":"待完成"})self.tree.insert("",tk.END,values=(task_id,task_text,create_time,"待完成"))self.task_entry.delete(0,tk.END)self.update_status()else:messagebox.showwarning("警告","请输入任务内容")defcomplete_task(self):selected=self.tree.selection()ifselected:item=self.tree.item(selected[0])task_id=item['values'][0]fortaskinself.tasks:iftask["id"]==task_id:task["status"]="已完成"breakself.tree.item(selected[0],values=(item['values'][0],item['values'][1],item['values'][2],"已完成"))self.update_status()else:messagebox.showwarning("警告","请选择要完成的任务")defdelete_task(self):selected=self.tree.selection()ifselected:ifmessagebox.askyesno("确认","确定要删除选中的任务吗?"):item=self.tree.item(selected[0])task_id=item['values'][0]self.tasks=[taskfortaskinself.tasksiftask["id"]!=task_id]self.tree.delete(selected[0])self.update_status()else:messagebox.showwarning("警告","请选择要删除的任务")defclear_all(self):ifself.tasksandmessagebox.askyesno("确认","确定要清空所有任务吗?"):self.tasks.clear()foriteminself.tree.get_children():self.tree.delete(item)self.update_status()defupdate_status(self):total=len(self.tasks)completed=sum(1fortaskinself.tasksiftask["status"]=="已完成")self.status_label.config(text=f"总任务数:{total}| 已完成:{completed}| 待完成:{total-completed}")defmain():root=tk.Tk()app=TodoApp(root)root.mainloop()if__name__=="__main__":main()

总结

这个教程涵盖了 Tkinter 的基础知识和常用功能:

  1. 基础组件:Label、Button、Entry、Text 等
  2. 布局管理:pack、grid、place 三种布局方式
  3. 事件处理:鼠标、键盘和各种组件事件
  4. 高级组件:Combobox、Listbox、Progressbar 等
  5. 综合应用:创建完整的 GUI 应用程序

通过这个教程,你应该能够开始使用 Tkinter 创建自己的图形界面应用程序。继续练习的最好方式是尝试修改示例代码,添加新功能,或者创建自己的小项目。

http://www.jsqmd.com/news/75696/

相关文章:

  • 演讲稿:TRAE SOLO 实战赛——智启Coding 码力全开,让AI为你打造完美旅程
  • 广告创意新工具:基于Wan2.2-T2V-A14B的自动化视频生产
  • 突破模态壁垒:Step-Audio-AQAA端到端语音交互开启人机对话新纪元
  • Mona Sans终极指南:深度解析GitHub可变字体技术原理与实战应用
  • 2025年国内国产挤出滚圆机推荐型号推荐厂家生产厂家哪个品牌好实力厂家十大品牌价格推荐厂家 - 品牌推荐大师1
  • MTK设备解锁终极指南:简单三步绕过bootrom保护
  • 爱美剧Mac客户端:你的智能美剧观影管家
  • 薄膜光学与镀膜技术高清PDF完整学习指南
  • 零成本企业安全监控:开源SOC平台搭建完全指南
  • 终极指南:用Markdown Here轻松美化邮件的完整教程
  • Nuke视觉特效终极指南:200+专业工具一键部署方案
  • Double Take:一站式人脸识别管理平台的终极解决方案
  • TripoSR实战宝典:5秒从图片到专业3D模型的完整攻略
  • 斩获10k star,一款爆火的B站开源客户端!
  • 极客时间:Claude与Cursor智能开发实战
  • Navicat重置工具:macOS试用期延长终极指南 [特殊字符]
  • 【前沿技术解密】:量子Agent为何需要多语言协同?背后架构你不可不知
  • 如何提高微信小游戏分享转化率?试试这7个接口
  • 25、计算机安全事件报告指南
  • Qwen3-8B-MLX-8bit:双模式切换重塑边缘AI部署新标准
  • 2、Linux 系统音频工具与架构全解析
  • 4步出图效率革命:Qwen-Image-Edit-Rapid-AIO V10重构AI图像创作流程
  • 2025深度测评10款降ai率工具:谁是规避检测与保留质量的最优解?(附论文降AI避坑指南)
  • Wan2.2-T2V-A14B模型的错误恢复与断点续生功能
  • Llama-Factory背后的分布式训练引擎技术揭秘
  • Vue文件管理器的终极解决方案:wl-explorer革命性体验
  • LibreCAD:零基础入门专业2D绘图的全能开源解决方案
  • Wan2.2-T2V-A14B是否支持镜头语言指令?实测验证
  • Wan2.2-T2V-A14B如何理解‘风吹树叶’这类物理动词?
  • Wan2.2-T2V-A14B模型在高校招生宣传片定制中的竞争优势