2010-07-26 130 views
4

如何将标准输出数据重定向到tkinter文本控件?标准输出到tkinter GUI

+0

第1步。去接受一些你以前的问题的答案... – 2010-07-26 12:41:17

回答

10

您需要制作一个类似文件的类,它的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__ 
+0

嗨!你能否给我提供一个例子?我对python非常感兴趣,而且我正在努力实现这个目标。非常感谢:) – FLX 2010-07-26 18:35:17

+0

我认为,链接的问题具有您需要的所有代码。你需要制作你自己的'StdoutRedirector'类版本,然后设置'sys.stdout = StdoutRedirector'。我会将代码复制到我的答案中。 – katrielalex 2010-07-27 08:32:47

0

这是一个老问题,但我发现,我想一个解决方案与社区分享。我的例子将工作目录列表管理到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 dir_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()