You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:30:51