【发布时间】:2011-03-20 23:40:11
【问题描述】:
如何将标准输出数据重定向到 tkinter 文本小部件?
【问题讨论】:
-
第 1 步。去接受您之前问题的一些答案...
如何将标准输出数据重定向到 tkinter 文本小部件?
【问题讨论】:
这是一个老问题,但我找到了一个我想与社区分享的解决方案。我的示例将工作目录列表通过管道传输到 Tk 窗口。我在 Windows 8 上使用 Python 3.6。我使用 Pydev 通过 Jupyter Notebook 和 Eclipse 运行代码。
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()
【讨论】:
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)
来自here
【讨论】:
您需要创建一个类似文件的类,其 write 方法改为写入 Tkinter 小部件,然后执行 sys.stdout = <your new class>。见this question。
示例(从链接复制):
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__
【讨论】:
StdoutRedirector 类版本,然后设置 sys.stdout = StdoutRedirector。我会将代码复制到我的答案中。