¿Cómo redirigir en STDOUT en tiempo real del módulo importado al widget de texto Tkinter en python?
Estoy tratando de redirigir la salida estándar a un widget de texto Tkinter en tiempo real usando Python 2.7.2 en Windows 7. En mi código a continuación, pretendía que una declaración de impresión apareciera en el widget de texto cada 2 segundos. Lo que sucede, en cambio, es que las 3 líneas
Received sleep-command
Going to sleep for 2 s
Just woke up
aparece simultáneamente tan pronto como se hayan evaluado sleep () y mod1.main ().
Sorprendentemente (para mí, al menos) el problema desaparece cuando no redirecciono la salida estándar. Es decir, si comento fuera de la línea.
sys.stdout = StdoutRedirector(outputPanel)
IDLE muestra las declaraciones de impresión en tiempo real. ¿Alguien me puede explicar esto y sugerir una manera de evitarlo? ¡Gracias por adelantado!
Aquí está mi código de ejemplo:
mod1.py
import time
import sys
def main():
print('Going to sleep for 2 s')
time.sleep(2)
print('Just woke up')
text_GUI.py
from Tkinter import *
import sys
import time
import mod1
old_stdout = sys.stdout
class StdoutRedirector(object):
def __init__(self, text_area):
self.text_area = text_area
def write(self, str):
self.text_area.insert(END, str)
self.text_area.see(END)
def sleep():
print('Received sleep-command')
time.sleep(2)
mod1.main()
root = Tk()
# Textbox
outputPanel = Text(root, wrap='word', height = 11, width=50)
outputPanel.grid(column=0, row=0, columnspan = 2, sticky='NSWE', padx=5, pady=5)
sys.stdout = StdoutRedirector(outputPanel)
# Sleep button
sleepBtn = Button(root, text='Sleep', command=sleep)
sleepBtn.grid(row=1, column=1, sticky='E', padx=5, pady=5)
root.mainloop()
sys.stdout = old_stdout