ZhuangLeo2 发表于 2026-7-1 09:10:18

txt阅读编辑器

Python3做的txt阅读编辑器:代码来了。#读取txt.py
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter.font import Font


class TxtViewer:
    def __init__(self, root):
      self.root = root
      self.root.title("TXT文本查看编辑器")
      self.root.geometry("800x600")
      
      # 当前打开文件路径
      self.current_file = None
      # 初始化默认字体字号
      self.default_size = 12
      self.default_family = "微软雅黑"
      
      # 创建顶部菜单栏
      self.menu_bar = tk.Menu(self.root)
      
      # 1. 文件菜单
      self.file_menu = tk.Menu(self.menu_bar, tearoff=0)
      self.file_menu.add_command(label="打开文件", command=self.open_file)
      self.file_menu.add_command(label="保存文件", command=self.save_file)
      self.file_menu.add_separator()
      self.file_menu.add_command(label="退出", command=self.root.quit)
      self.menu_bar.add_cascade(label="文件", menu=self.file_menu)
      
      # 2. 字号调整菜单
      self.size_menu = tk.Menu(self.menu_bar, tearoff=0)
      # 添加常用字号选项
      for size in :
            self.size_menu.add_command(label=f"{size}号", command=lambda s=size: self.change_size(s))
      self.menu_bar.add_cascade(label="字号", menu=self.size_menu)
      
      # 3. 字体调整菜单
      self.font_menu = tk.Menu(self.menu_bar, tearoff=0)
      # 添加常用中文字体
      for family in ["微软雅黑", "宋体", "黑体", "楷体", "Arial", "Times New Roman", "Courier New"]:
            self.font_menu.add_command(label=family, command=lambda f=family: self.change_family(f))
      self.menu_bar.add_cascade(label="字体", menu=self.font_menu)
      
      # 绑定菜单栏到主窗口
      self.root.config(menu=self.menu_bar)
      
      # 创建可编辑文本区域,开启自动换行
      self.text_font = Font(family=self.default_family, size=self.default_size)
      self.text_area = tk.Text(
            self.root,
            wrap=tk.WORD,
            font=self.text_font,
            padx=10,
            pady=10
      )
      self.text_area.pack(fill=tk.BOTH, expand=True)
      
      # 添加滚动条
      self.scroll_bar = tk.Scrollbar(self.text_area, command=self.text_area.yview)
      self.text_area.config(yscrollcommand=self.scroll_bar.set)
      self.scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)

    def open_file(self):
      """打开选中的TXT文件"""
      file_path = filedialog.askopenfilename(
            title="选择要打开的TXT文件",
            filetypes=[("文本文档(*.txt)", "*.txt"), ("所有文件", "*.*")]
      )
      if not file_path:
            return
      
      file = None
      try:
            file = open(file_path, "r", encoding="utf-8")
            content = file.read()
            # 清空原有内容,插入新读取的内容
            self.text_area.delete(1.0, tk.END)
            self.text_area.insert(tk.END, content)
            # 更新状态
            self.current_file = file_path
            self.root.title(f"TXT查看器 - {file_path.split('/')[-1]}")
      except Exception as e:
            messagebox.showerror("打开错误", f"打开文件失败: {str(e)}")
            if file:
                file.close()
            self.current_file = None
      finally:
            # 保证异常时文件一定会被关闭
            if file and not file.closed:
                file.close()

    def save_file(self):
      """通过另存为保存文件"""
      save_path = filedialog.asksaveasfilename(
            title="保存文件",
            defaultextension=".txt",
            filetypes=[("文本文档(*.txt)", "*.txt"), ("所有文件", "*.*")]
      )
      if not save_path:
            return
      
      file = None
      try:
            content = self.text_area.get(1.0, tk.END)
            file = open(save_path, "w", encoding="utf-8")
            file.write(content)
            self.current_file = save_path
            self.root.title(f"TXT查看器 - {save_path.split('/')[-1]}")
            messagebox.showinfo("保存成功", f"文件已成功保存到:\n{save_path}")
      except Exception as e:
            messagebox.showerror("保存错误", f"保存文件失败: {str(e)}")
            if file:
                file.close()
      finally:
            if file and not file.closed:
                file.close()

    def change_size(self, new_size):
      """修改文本字号"""
      self.text_font.configure(size=new_size)

    def change_family(self, new_family):
      """修改文本字体"""
      self.text_font.configure(family=new_family)


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

FishC 发表于 2026-7-1 09:10:32

您的代码存在几个语法错误和逻辑问题,以下是修正建议:

主要问题:

[*]第16行和23行的 for size in : 和 for family in : 缺少可迭代列表,应填充具体字号和字体名称。
[*]第38行和78行的 filetypes= 缺少文件类型元组,应写成 [("文本文件", "*.txt"), ("所有文件", "*.*")]。
[*]第57行和83行使用 file_path.split('/') 返回列表,不能直接用于标题,应取最后一个元素,例如 file_path.split('/')[-1] 或使用 os.path.basename(file_path)。
[*]建议导入 import os 以兼容不同操作系统的路径分隔符。


修正后的主要代码片段:

import os
...
# 字号列表
for size in :
    self.size_menu.add_command(label=f"{size}号", command=lambda s=size: self.change_size(s))
# 字体列表
for family in ["微软雅黑", "宋体", "黑体", "楷体", "仿宋", "Arial", "Times New Roman"]:
    self.font_menu.add_command(label=family, command=lambda f=family: self.change_family(f))
...
# 打开文件
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
file_path = filedialog.askopenfilename(title="选择要打开的TXT文件", filetypes=filetypes)
...
# 设置窗口标题
self.root.title(f"TXT查看器 - {os.path.basename(file_path)}")
...
# 保存文件
save_path = filedialog.asksaveasfilename(title="保存文件", defaultextension=".txt", filetypes=filetypes)
...
self.root.title(f"TXT查看器 - {os.path.basename(save_path)}")


此外,您还可以考虑:

[*]增加“另存为”功能与“保存”区分,当前“保存”实际是另存为。
[*]统一窗口标题初始为 "TXT文本查看编辑器" 或修改后的名称。
[*]处理字体列表中中文字体在非中文系统上可能失效的问题,可添加 try/except 或使用系统通用字体。


修改后代码即可正常运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: txt阅读编辑器