当前位置:首页>python>用Python打造属于自己的简易文本编辑器(附完整代码)

用Python打造属于自己的简易文本编辑器(附完整代码)

  • 2026-09-10 23:33:52
用Python打造属于自己的简易文本编辑器(附完整代码)

你是否曾经想过,每天使用的记事本、文本编辑器是如何工作的?用Python,只需几十行代码,你就能打造一个功能完备的文本编辑器。今天,我们就用Python内置的Tkinter库,手把手实现一个带有菜单栏、文件读写、编辑操作(剪切/复制/粘贴/撤销)的简易文本编辑器。无论你是Python新手还是老手,这个小项目都能让你快速了解GUI编程的乐趣。


为什么选择Tkinter?

Tkinter是Python标准库中自带的GUI工具包,无需额外安装,跨平台(Windows/macOS/Linux)支持良好。用它来写一个文本编辑器,正好能涵盖GUI编程的常见元素:

  • 窗口、布局管理

  • 菜单栏设计

  • 文件对话框

  • 事件绑定

  • 文本控件的高级操作

我们的目标:实现一个轻量级记事本,支持新建、打开、保存、另存为,以及剪切、复制、粘贴、撤销、重做、全选等基础功能。


最终效果预览

运行程序后,你会得到一个简洁的窗口:

  • 顶部是菜单栏(文件、编辑、帮助)

  • 中央是带滚动条的文本编辑区

  • 底部是状态栏,显示当前文件路径或编辑状态

你可以像使用普通记事本一样输入文字,通过菜单或快捷键操作文件,所有功能都直观可用。


一步步拆解核心代码

1. 导入模块与初始化窗口

import tkinter as tkfrom tkinter import filedialog, messagebox, scrolledtextimport osclass SimpleEditor:    def __init__(self, root):        self.root = root        self.root.title("简易文本编辑器")        self.root.geometry("600x400")        self.current_file = None  # 记录当前打开的文件路径
  • scrolledtext 提供了带滚动条的文本框,方便处理大文本。

  • filedialog 用于打开/保存文件对话框。

  • messagebox 用于弹出提示或警告。

2. 创建文本编辑区

self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, undo=True)self.text_area.pack(expand=True, fill=tk.BOTH)

wrap=tk.WORD 保证单词在换行时不被截断;undo=True 启用撤销/重做功能。

3. 构建菜单栏

我们设计三个菜单:文件、编辑、帮助。

menubar = tk.Menu(root)root.config(menu=menubar)# 文件菜单file_menu = tk.Menu(menubar, tearoff=0)menubar.add_cascade(label="文件", menu=file_menu)file_menu.add_command(label="新建", accelerator="Ctrl+N", command=self.new_file)file_menu.add_command(label="打开", accelerator="Ctrl+O", command=self.open_file)file_menu.add_command(label="保存", accelerator="Ctrl+S", command=self.save_file)file_menu.add_command(label="另存为", accelerator="Ctrl+Shift+S", command=self.save_as_file)file_menu.add_separator()file_menu.add_command(label="退出", accelerator="Ctrl+Q", command=self.quit_app)# 编辑菜单(类似方式添加剪切、复制、粘贴、撤销、重做、全选)# 帮助菜单(关于)

accelerator 仅显示快捷键提示,实际快捷键需要通过事件绑定或event_generate实现。我们在方法中直接调用了文本控件的内置方法(如edit_undo、edit_redo)或使用event_generate模拟标准编辑事件。

4. 状态栏

self.status_bar = tk.Label(root, text="就绪", anchor=tk.W, relief=tk.SUNKEN)self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)

状态栏显示当前文件状态或操作反馈。

5. 文件操作核心方法

新建文件:检查当前内容是否已保存,防止丢失。

def new_file(self):    if self.text_area.get(1.0, tk.END).strip():        if not messagebox.askyesno("新建", "当前文件未保存,是否丢弃更改?"):            return    self.text_area.delete(1.0, tk.END)    self.current_file = None    self.root.title("简易文本编辑器 - 新建文件")    self.status_bar.config(text="新建文件")
打开文件:通过filedialog选择文件,读取内容并显示。
def open_file(self):    file_path = filedialog.askopenfilename(defaultextension=".txt",                     filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])    if not file_path:        return    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(1.0, content)        self.current_file = file_path        self.root.title(f"简易文本编辑器 - {os.path.basename(file_path)}")        self.status_bar.config(text=f"已打开: {file_path}")    except Exception as e:        messagebox.showerror("错误", f"无法打开文件: {e}")

保存与另存为:保存时若已有路径则直接写入,否则弹出另存为对话框。

6. 编辑功能实现

利用event_generate可以很方便地触发标准编辑事件,无需手动操作选中区域。

def cut(self):    self.text_area.event_generate("<<Cut>>")def copy(self):    self.text_area.event_generate("<<Copy>>")def paste(self):    self.text_area.event_generate("<<Paste>>")
全选功能则通过设置SEL标签实现。
def select_all(self):    self.text_area.tag_add(tk.SEL, "1.0", tk.END)    self.text_area.mark_set(tk.INSERT, "1.0")    self.text_area.see(tk.INSERT)    return "break"  # 阻止默认行为

7. 退出时的保存提醒

def quit_app(self):    if self.text_area.get(1.0, tk.END).strip():        if not messagebox.askyesno("退出", "有未保存的更改,确定退出吗?"):            return    self.root.destroy()

8. 主程序入口

if __name__ == "__main__":    root = tk.Tk()    app = SimpleEditor(root)    root.mainloop()

完整代码汇总

将上述所有代码片段整合到一起,即可得到一个可运行的程序。为方便大家复制,我将完整代码贴在下面(你也可以在文末找到全部代码):

import tkinter as tkfrom tkinter import filedialog, messagebox, scrolledtextimport osclass SimpleEditor:    def __init__(self, root):        self.root = root        self.root.title("简易文本编辑器")        self.root.geometry("600x400")        self.current_file = None        # 文本区域        self.text_area = scrolledtext.ScrolledText(root, wrap=tk.WORD, undo=True)        self.text_area.pack(expand=True, fill=tk.BOTH)        # 菜单栏        menubar = tk.Menu(root)        root.config(menu=menubar)        # 文件菜单        file_menu = tk.Menu(menubar, tearoff=0)        menubar.add_cascade(label="文件", menu=file_menu)        file_menu.add_command(label="新建", accelerator="Ctrl+N", command=self.new_file)        file_menu.add_command(label="打开", accelerator="Ctrl+O", command=self.open_file)        file_menu.add_command(label="保存", accelerator="Ctrl+S", command=self.save_file)        file_menu.add_command(label="另存为", accelerator="Ctrl+Shift+S", command=self.save_as_file)        file_menu.add_separator()        file_menu.add_command(label="退出", accelerator="Ctrl+Q", command=self.quit_app)        # 编辑菜单        edit_menu = tk.Menu(menubar, tearoff=0)        menubar.add_cascade(label="编辑", menu=edit_menu)        edit_menu.add_command(label="撤销", accelerator="Ctrl+Z", command=self.text_area.edit_undo)        edit_menu.add_command(label="重做", accelerator="Ctrl+Y", command=self.text_area.edit_redo)        edit_menu.add_separator()        edit_menu.add_command(label="剪切", accelerator="Ctrl+X", command=self.cut)        edit_menu.add_command(label="复制", accelerator="Ctrl+C", command=self.copy)        edit_menu.add_command(label="粘贴", accelerator="Ctrl+V", command=self.paste)        edit_menu.add_separator()        edit_menu.add_command(label="全选", accelerator="Ctrl+A", command=self.select_all)        # 帮助菜单        help_menu = tk.Menu(menubar, tearoff=0)        menubar.add_cascade(label="帮助", menu=help_menu)        help_menu.add_command(label="关于", command=self.show_about)        # 状态栏        self.status_bar = tk.Label(root, text="就绪", anchor=tk.W, relief=tk.SUNKEN)        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)        # 文本修改状态跟踪(可扩展)        self.text_area.bind("<<Modified>>", self.on_text_changed)    def new_file(self):        if self.text_area.get(1.0, tk.END).strip():            if not messagebox.askyesno("新建", "当前文件未保存,是否丢弃更改?"):                return        self.text_area.delete(1.0, tk.END)        self.current_file = None        self.root.title("简易文本编辑器 - 新建文件")        self.status_bar.config(text="新建文件")    def open_file(self):        file_path = filedialog.askopenfilename(defaultextension=".txt", filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])        if not file_path:            return        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(1.0, content)            self.current_file = file_path            self.root.title(f"简易文本编辑器 - {os.path.basename(file_path)}")            self.status_bar.config(text=f"已打开: {file_path}")        except Exception as e:            messagebox.showerror("错误", f"无法打开文件: {e}")    def save_file(self):        if self.current_file:            try:                content = self.text_area.get(1.0, tk.END)                with open(self.current_file, 'w', encoding='utf-8') as f:                    f.write(content)                self.status_bar.config(text=f"已保存: {self.current_file}")                self.root.title(f"简易文本编辑器 - {os.path.basename(self.current_file)}")            except Exception as e:                messagebox.showerror("错误", f"保存失败: {e}")        else:            self.save_as_file()    def save_as_file(self):        file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")])        if not file_path:            return        try:            content = self.text_area.get(1.0, tk.END)            with open(file_path, 'w', encoding='utf-8') as f:                f.write(content)            self.current_file = file_path            self.root.title(f"简易文本编辑器 - {os.path.basename(file_path)}")            self.status_bar.config(text=f"已保存: {file_path}")        except Exception as e:            messagebox.showerror("错误", f"保存失败: {e}")    def quit_app(self):        if self.text_area.get(1.0, tk.END).strip():            if not messagebox.askyesno("退出", "有未保存的更改,确定退出吗?"):                return        self.root.destroy()    def cut(self):        self.text_area.event_generate("<<Cut>>")    def copy(self):        self.text_area.event_generate("<<Copy>>")    def paste(self):        self.text_area.event_generate("<<Paste>>")    def select_all(self):        self.text_area.tag_add(tk.SEL, "1.0", tk.END)        self.text_area.mark_set(tk.INSERT, "1.0")        self.text_area.see(tk.INSERT)        return "break"    def show_about(self):        messagebox.showinfo("关于", "简易文本编辑器\n使用Python Tkinter实现\n版本1.0")    def on_text_changed(self, event=None):        self.status_bar.config(text="已修改" if self.text_area.edit_modified() else "就绪")        self.text_area.edit_modified(False)if __name__ == "__main__":    root = tk.Tk()    app = SimpleEditor(root)    root.mainloop()

如何运行与测试?

  1. 确保你的Python环境(3.x版本)已安装Tkinter(通常默认自带)。

  2. 将上述代码保存为 editor.py。

  3. 在终端或命令行中执行 python editor.py。

  4. 窗口弹出,即可开始使用。

试试打开一个已有的文本文件,编辑后保存,体验完整的编辑流程。


扩展思路:还能加什么功能?

这个基础版本已经可以满足日常轻量编辑需求,但如果你有更多创意,可以继续添加:

  • 字体/字号设置:通过tk.font模块实现。

  • 查找与替换:弹出新窗口,输入关键词进行搜索或替换。

  • 行号显示:在文本框左侧添加行号。

  • 自动保存:定时保存当前内容。

  • 语法高亮:对于特定编程语言,可以使用tkinter的Text标签实现颜色区分。

  • 打印功能:调用系统打印对话框。

这些扩展不仅能让你的编辑器更强大,也是学习更复杂GUI编程的绝佳练习。


总结

今天我们仅用Python标准库就实现了一个跨平台的文本编辑器,代码量不大,却涵盖了GUI编程的众多常用组件和事件处理。这个项目非常适合作为Python入门后的第一个图形化实战练习。你可以根据需求任意修改和扩展,把它变成你专属的写作工具。

如果你在运行过程中遇到任何问题,欢迎在评论区留言,我会尽力解答。觉得有用的话,记得点赞、分享,让更多朋友一起动手实践!

最新文章

随机文章