修改Tkinter控制台输出重定向模块,新增输出保存至TXT功能
Tkinter输出重定向+日志保存模块修改方案
以下是修改后的完整代码,在保留原有Tkinter窗口输出功能的基础上,新增了控制台输出自动保存到TXT文件的功能,同时避免了模块崩溃问题:
import sys import tkinter as tk from tkinter import scrolledtext import io from datetime import datetime class ConsoleRedirector(io.TextIOBase): def __init__(self, text_widget, log_file_path="app_output.log"): self.text_widget = text_widget self.log_file = open(log_file_path, "a", encoding="utf-8") # 备份原始输出流 self.original_stdout = sys.stdout self.original_stderr = sys.stderr def write(self, message): # 写入日志文件,自动添加时间戳 self.log_file.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {message}") self.log_file.flush() # 线程安全写入Tkinter文本框 def safe_insert(): self.text_widget.insert(tk.END, message) self.text_widget.see(tk.END) # 自动滚动到最新内容 self.text_widget.after(0, safe_insert) def flush(self): # 同步刷新文件和文本框 self.log_file.flush() self.text_widget.update_idletasks() def restore(self): # 程序退出时恢复原始输出并关闭日志文件 sys.stdout = self.original_stdout sys.stderr = self.original_stderr self.log_file.close() def setup_console(window, log_path="app_output.log"): # 创建滚动文本框作为控制台界面 console = scrolledtext.ScrolledText(window, wrap=tk.WORD, bg="black", fg="white", font=("Consolas", 10)) console.pack(expand=True, fill="both") # 初始化重定向器并替换系统输出流 redirector = ConsoleRedirector(console, log_path) sys.stdout = redirector sys.stderr = redirector return redirector # 使用示例 if __name__ == "__main__": root = tk.Tk() root.title("Tkinter Console with Log") # 设置控制台和日志文件路径 redirector = setup_console(root, "my_app_log.log") # 测试输出 print("这是标准输出测试内容") import traceback try: 1 / 0 except ZeroDivisionError: traceback.print_exc() # 窗口关闭时执行资源清理 root.protocol("WM_DELETE_WINDOW", lambda: (redirector.restore(), root.destroy())) root.mainloop()
关键修改说明
- 日志文件处理:初始化时以追加模式打开指定路径的日志文件,每条输出自动添加时间戳,避免覆盖历史记录
- 双输出逻辑:
write方法同时完成日志文件写入和Tkinter文本框插入,文本框插入用after(0)保证线程安全,避免Tkinter主线程阻塞 - 资源回收:新增
restore方法,在程序退出时恢复原始的sys.stdout和sys.stderr,并关闭日志文件句柄,防止资源泄漏 - 错误兼容:保留对
sys.stderr的重定向,异常信息也会同时输出到窗口和日志文件
内容的提问来源于stack exchange,提问作者The One
相关产品推荐
相关产品推荐

