学了这么多 Python 基础,是时候做一个真正能用的小程序了!今天我们用 Python 内置的 Tkinter 库,从零搭建一个图形界面的 Todo List 应用——支持添加、勾选完成、删除任务,不需要安装任何第三方库,Python 自带就能跑。
🖼️ 什么是 Tkinter?
Tkinter 是 Python 内置的 GUI(图形界面)库,安装 Python 就自带了,无需 pip 安装。它提供了窗口、按钮、文本框等各种界面组件,适合做桌面小工具。
✅
无需安装
Python 自带
🎯
简单易学
几行代码出界面
💻
跨平台
Win/Mac/Linux 都能跑
👀 先看效果
我们要做的应用长这样:
📝 我的 Todo List
输入任务...
添加
✓
学习 Python 基础
写一个 Todo List
挑战更多小项目
删除已完成
🪟 第一步:弹出一个窗口
我们先从最简单的开始——让一个窗口出现在屏幕上:
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("我的 Todo List")
root.geometry("400x500")# 宽x高
# 启动事件循环(必须有,否则窗口一闪而过)
root.mainloop()
运行后你会看到一个 400×500 的空白窗口。mainloop() 是 Tkinter 的事件循环,让程序保持运行、响应点击。
🧩 第二步:认识三个核心组件
Entry — 单行输入框
entry = tk.Entry(root, width=30)
entry.pack(pady=5) # pack 放到窗口里
Button — 按钮
btn = tk.Button(root, text="点我", command=do_something)
btn.pack()
Listbox — 列表框
listbox = tk.Listbox(root, height=10)
listbox.insert(tk.END, "新任务") # 在末尾添加一条
listbox.pack()
🚀 完整代码(可直接运行)
新建 todo.py,把下面的代码全部粘贴进去,直接运行:
import tkinter as tk
from tkinter import messagebox
# ---- 数据层:用列表存储任务 ----
tasks = [] # 每条格式:{"text": "...", "done": False}
# ---- 功能函数 ----
def add_task():
text = entry.get().strip()
if not text:
messagebox.showwarning("提示", "任务内容不能为空!")
return
tasks.append({"text": text, "done": False})
entry.delete(0, tk.END) # 清空输入框
refresh_list()
def toggle_done():
sel = listbox.curselection()
if not sel: return
idx = sel[0]
tasks[idx]["done"] = not tasks[idx]["done"]
refresh_list()
def delete_done():
global tasks
tasks = [t for t in tasks if not t["done"]]
refresh_list()
def refresh_list():
"""重新渲染整个列表"""
listbox.delete(0, tk.END)
for t in tasks:
mark = "✅ "if t["done"] else"⬜ "
listbox.insert(tk.END, mark + t["text"])
# ---- 构建界面 ----
root = tk.Tk()
root.title("📝 我的 Todo List")
root.geometry("400x500")
root.configure(bg="#f5f5f5")
# 输入区
frame_input = tk.Frame(root, bg="#f5f5f5")
frame_input.pack(pady=15, padx=20, fill="x")
entry = tk.Entry(frame_input, font=("Arial", 13), width=24)
entry.pack(side="left", ipady=5)
entry.bind("<Return>", lambda e: add_task()) # 回车添加
tk.Button(frame_input, text="添加", command=add_task,
bg="#e94560", fg="white", font=("Arial", 12)).pack(side="left", padx=8)
# 列表框
listbox = tk.Listbox(root, height=15,
font=("Arial", 13), selectbackground="#e94560")
listbox.pack(padx=20, fill="both", expand=True)
# 操作按钮
frame_btn = tk.Frame(root, bg="#f5f5f5")
frame_btn.pack(pady=12)
tk.Button(frame_btn, text="✅ 标记完成", command=toggle_done,
bg="#a6e3a1", font=("Arial", 11)).pack(side="left", padx=8)
tk.Button(frame_btn, text="🗑️ 删除已完成", command=delete_done,
bg="#f38ba8", font=("Arial", 11)).pack(side="left", padx=8)
root.mainloop()
🔍 三个关键点解析
① 用列表存数据,字典存每条任务
tasks 是一个列表,每个元素是字典 {"text": "...", "done": False}。这样就能同时记录任务内容和是否完成两个状态,比只存字符串更灵活。
② refresh_list() 全量刷新策略
每次数据变化都先 delete(0, END) 清空列表框,再重新插入所有数据。这是 Tkinter 最简单的更新方式,数据量小时完全够用,不用担心性能。
③ bind 绑定键盘事件
entry.bind("<Return>", ...) 让用户在输入框按回车就能添加任务,比每次都点按钮方便多了。Tkinter 可以绑定各种键盘和鼠标事件。
📋 Tkinter 组件速查
Label
显示文字/图片
Entry
单行文本输入框
Button
可点击按钮
Listbox
可选择的列表框
Frame
容器,用于分组布局
Text
多行文本输入框
Checkbutton
复选框
pack / grid
两种布局方式
✍️ 动手练习
🥉 初级:把代码跑起来,添加 3 条任务,标记完成,再删除已完成的
🥈 中级:添加"删除选中"功能——选中某条任务后点按钮直接删除(不管是否完成)
🥇 挑战:用 json 模块把任务保存到本地文件,下次打开程序时自动加载——让 Todo List 真正"记住"你的任务!
恭喜你完成了第一个 Python 图形界面应用!Tkinter 能做的事还很多:计算器、文本编辑器、小游戏……一个可以运行的小程序,比看一百篇教程都管用。
🔮 下期预告
「算法入门:二分查找——用一张图搞懂最经典的搜索算法」明天见!