2010-07-26 5 views
4

Как я могу перенаправить данные stdout в текстовый виджет tkinter?stdout to tkinter GUI

+0

Шаг 1. Примите некоторые ответы на ваши предыдущие вопросы ... –

ответ

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

+0

Связанный вопрос имеет весь код, который вам нужен, я думаю. Вам нужно сделать свою собственную версию класса 'StdoutRedirector', как это делается там, а затем установить' sys.stdout = StdoutRedirector'. Я скопирую код в свой ответ. – katrielalex

0

Это старый вопрос, но я нашел решение, которое я хотел бы поделиться с сообществом. Мой пример передает список рабочего каталога в окно Tk. Я использую Python 3.6 в Windows 8. Я запускал код через 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 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()