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
相关产品推荐
相关产品推荐

