用 Python 30 分钟做出自己的记事本

用 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. 把版本1跑起来
  2. 改改窗口大小、字体、标题

接下来15–20分钟:

  1. 复制粘贴版本2代码
  2. 运行一次
  3. 试试 Ctrl+N / Ctrl+O / Ctrl+S
  4. 改一下字体(Consolas → 微软雅黑 或 JetBrains Mono)
  5. 可以把标题改成你喜欢的名字

如果还有5–10分钟余量,可以尝试加一行:

# 在 __init__ 最后加一句,设置默认字体更大一点
self.text_area.configure(font=("微软雅黑", 14))

祝你30分钟内做出属于自己的第一个记事本!

完成后可以截个图发给我看看~ 或者告诉我你想再加什么功能(自动保存、深色模式、查找替换、Markdown高亮等),我可以继续帮你迭代。

文章已创建 4725

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部