用 Python 在 30 分钟 内做出一个“自己的记事本”是非常可行的。
下面提供三种不同难度的版本,你可以根据自己当前水平选择其中一个开始做:
| 版本 | 难度 | 预计时间 | 技术栈 | 适合人群 | 功能亮点 |
|---|---|---|---|---|---|
| 版本1 | ★☆☆☆☆ | 10–15分钟 | tkinter | 完全新手 | 最简单图形界面记事本 |
| 版本2 | ★★☆☆☆ | 20–25分钟 | tkinter + 菜单 + 文件操作 | 入门1–3个月 | 有保存、打开、新建、快捷键 |
| 版本3 | ★★★☆☆ | 25–35分钟 | tkinter + 主题 + 自动保存 + 搜索 | 想做更完整一点 | 更像现代记事本体验 |
推荐路线(30分钟目标)
- 先花 10分钟 把版本1跑起来(建立成就感)
- 再花 10–15分钟 升级到版本2(功能基本齐全)
- 如果还有时间或第二天继续 → 做版本3
版本1:最简版记事本(10–15分钟)
# notepad_minimal.py
import tkinter as tk
from tkinter import scrolledtext
root = tk.Tk()
root.title("我的记事本 v0.1")
root.geometry("800x600")
# 文本编辑区域
text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, font=("微软雅黑", 13))
text_area.pack(expand=True, fill="both")
root.mainloop()
运行方式:
python notepad_minimal.py
版本2:功能比较完整的记事本(20–30分钟)
# notepad_v2.py
import tkinter as tk
from tkinter import filedialog, messagebox, scrolledtext
import os
class Notepad:
def __init__(self, root):
self.root = root
self.root.title("我的记事本 v2")
self.root.geometry("960x720")
self.root.minsize(600, 400)
self.current_file = None
self.text_changed = False
# 文本区域
self.text_area = scrolledtext.ScrolledText(self.root, wrap=tk.WORD, undo=True, font=("Consolas", 13))
self.text_area.pack(expand=True, fill="both", padx=2, pady=2)
# 绑定事件
self.text_area.bind("<Control-s>", self.save_file)
self.text_area.bind("<Control-o>", self.open_file)
self.text_area.bind("<Control-n>", lambda e: self.new_file())
self.text_area.bind("<<Modified>>", self.on_text_change)
# 菜单栏
self.create_menu()
def create_menu(self):
menubar = tk.Menu(self.root)
self.root.config(menu=menubar)
file_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="文件(F)", menu=file_menu)
file_menu.add_command(label="新建(N)", accelerator="Ctrl+N", command=self.new_file)
file_menu.add_command(label="打开(O)", accelerator="Ctrl+O", command=self.open_file)
file_menu.add_command(label="保存(S)", accelerator="Ctrl+S", command=self.save_file)
file_menu.add_command(label="另存为(A)...", command=self.save_as_file)
file_menu.add_separator()
file_menu.add_command(label="退出(X)", command=self.quit_app)
def on_text_change(self, event=None):
self.text_changed = True
title = f"我的记事本 - {os.path.basename(self.current_file) if self.current_file else '未命名'}*"
self.root.title(title)
def new_file(self):
if self.ask_save_if_changed():
self.text_area.delete(1.0, tk.END)
self.current_file = None
self.text_changed = False
self.root.title("我的记事本 - 未命名")
def open_file(self, event=None):
if not self.ask_save_if_changed():
return
file_path = filedialog.askopenfilename(
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
try:
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
self.text_area.delete(1.0, tk.END)
self.text_area.insert(tk.END, content)
self.current_file = file_path
self.text_changed = False
self.root.title(f"我的记事本 - {os.path.basename(file_path)}")
except Exception as e:
messagebox.showerror("错误", f"打开文件失败:{e}")
def save_file(self, event=None):
if not self.current_file:
return self.save_as_file()
try:
with open(self.current_file, "w", encoding="utf-8") as f:
f.write(self.text_area.get(1.0, tk.END).rstrip())
self.text_changed = False
self.root.title(f"我的记事本 - {os.path.basename(self.current_file)}")
return True
except Exception as e:
messagebox.showerror("错误", f"保存失败:{e}")
return False
def save_as_file(self):
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
self.current_file = file_path
return self.save_file()
return False
def ask_save_if_changed(self):
if self.text_changed:
answer = messagebox.askyesnocancel("提示", "文件已修改,是否保存?")
if answer is None: # 取消
return False
if answer: # 是 → 保存
return self.save_file()
return True # 否 或 无修改 → 继续
def quit_app(self):
if self.ask_save_if_changed():
self.root.quit()
if __name__ == "__main__":
root = tk.Tk()
app = Notepad(root)
root.mainloop()
快速上手建议(30分钟计划)
前10分钟:
- 把版本1跑起来
- 改改窗口大小、字体、标题
接下来15–20分钟:
- 复制粘贴版本2代码
- 运行一次
- 试试 Ctrl+N / Ctrl+O / Ctrl+S
- 改一下字体(Consolas → 微软雅黑 或 JetBrains Mono)
- 可以把标题改成你喜欢的名字
如果还有5–10分钟余量,可以尝试加一行:
# 在 __init__ 最后加一句,设置默认字体更大一点
self.text_area.configure(font=("微软雅黑", 14))
祝你30分钟内做出属于自己的第一个记事本!
完成后可以截个图发给我看看~ 或者告诉我你想再加什么功能(自动保存、深色模式、查找替换、Markdown高亮等),我可以继续帮你迭代。