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

Python Tkinter点击start按钮运行脚本输出无法显示在ScrolledText框问题问询

修复方案

核心问题是os.system()会直接将子进程的输出绑定到系统终端,没有做输出捕获重定向,所以内容无法进入GUI的文本框。使用subprocess模块捕获脚本输出后插入ScrolledText组件即可解决,修改后代码如下:

from tkinter import *
from tkinter import ttk
from tkinter import filedialog
import sys
import os
import subprocess
import tkinter.scrolledtext as tkst

root = Tk()
root.title("WLP")
root.geometry("950x450")
# 如无对应ico文件可注释下一行避免报错
# root.iconbitmap("Vo1d.ico")
root.configure(bg='#0c0c0c')

def clickstart():
    # 清空文本框原有内容
    Textbox.delete(1.0, END)
    # 运行脚本并捕获输出,指定编码避免中文乱码
    proc = subprocess.Popen(
        ['python', 'WLP.py'],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,  # 合并错误输出到正常输出流
        text=True,
        encoding='utf-8'
    )
    # 逐行读取输出插入文本框
    for line in iter(proc.stdout.readline, ''):
        Textbox.insert(END, line)
        # 实时刷新文本框,避免输出堆积到脚本运行结束才显示
        Textbox.update()
    proc.wait()

Button1 = Button(root, text="START", bg="#0c0c0c", fg="#C0C0C0", command=clickstart)
Textbox = tkst.ScrolledText(root, width=75, height=10, bg="#0c0c0c", fg="#C0C0C0")
Button1.grid(row=10, column=5, pady=15)
Textbox.grid(row=17, column=5)

root.mainloop()

可选优化

如果你的WLP.py运行时间较长,上述写法会导致GUI暂时无响应,可以把脚本运行逻辑放到独立子线程中,修改对应函数即可:

import threading

def run_script():
    Textbox.delete(1.0, END)
    proc = subprocess.Popen(
        ['python', 'WLP.py'],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True,
        encoding='utf-8'
    )
    for line in iter(proc.stdout.readline, ''):
        # tkinter组件更新必须在主线程执行,用after方法调度
        Textbox.after(0, lambda line=line: Textbox.insert(END, line))
    proc.wait()

def clickstart():
    threading.Thread(target=run_script, daemon=True).start()

内容的提问来源于stack exchange,提问作者Vo1d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:36:03