当前位置:首页>python>用 Python 写一个 Todo List 应用——Tkinter 图形界面,从入门到实战

用 Python 写一个 Todo List 应用——Tkinter 图形界面,从入门到实战

  • 2026-10-11 08:31:56
用 Python 写一个 Todo List 应用——Tkinter 图形界面,从入门到实战

学了这么多 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 能做的事还很多:计算器、文本编辑器、小游戏……一个可以运行的小程序,比看一百篇教程都管用。

🔮 下期预告

「算法入门:二分查找——用一张图搞懂最经典的搜索算法」明天见!

最新文章

随机文章