将stdout输出到tkinter GUI

9 投票
3 回答
16186 浏览
提问于 2025-04-16 01:50

我该如何把标准输出的数据重定向到一个tkinter的文本框里?

3 个回答

1
log_box_1 = tk.Text(root, borderwidth=3, relief="sunken")

with subprocess.Popen("ls -la", shell=True, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p:
            for line in p.stdout:
                log_box_1.insert(tk.END, line)

来自 这里

4

这是一个老问题,但我找到了解决办法,想和大家分享一下。我的例子是把当前工作目录的列表显示在一个Tk窗口里。我在Windows 8上使用Python 3.6运行这个代码。我通过Jupyter Notebook和Eclipse(使用Pydev)都试过这个代码。

import os
from tkinter import *
from subprocess import Popen, PIPE
root = Tk()
text = Text(root)
text.pack()

def ls_proc():
    return Popen(['ls'], stdout=PIPE)

with ls_proc() as p:
    if p.stdout:
        for line in p.stdout:
            text.insert(END, line)
    if p.stderr:
        for line in p.stderr:
            text.insert(END, line)

root.mainloop()
14

你需要创建一个像文件一样的类,这个类的 write 方法可以把内容写入 Tkinter 的控件中。然后你可以用 sys.stdout = <你的新类> 来替换标准输出。具体可以参考 这个问题

下面是一个例子(来自链接):

class IORedirector(object):
    '''A general class for redirecting I/O to this Text widget.'''
    def __init__(self,text_area):
        self.text_area = text_area

class StdoutRedirector(IORedirector):
    '''A class for redirecting stdout to this Text widget.'''
    def write(self,str):
        self.text_area.write(str,False)

然后,在你的 Tkinter 控件中:

# To start redirecting stdout:
import sys
sys.stdout = StdoutRedirector( self )
# (where self refers to the widget)

# To stop redirecting stdout:
sys.stdout = sys.__stdout__

撰写回答