Как перенаправить в режиме реального времени STDOUT из импортированного модуля в Tkinter Text Widget на python?
Я пытаюсь перенаправить стандартный вывод в виджет Tkinter Text в режиме реального времени, используя Python 2.7.2 для Windows 7. В своем коде ниже я намеревался, чтобы оператор print появлялся в виджете Text каждые 2 секунды. Вместо этого все 3 строки
Received sleep-command
Going to sleep for 2 s
Just woke up
появляются одновременно, как только sleep () и mod1.main () были оценены.
Удивительно (для меня, по крайней мере) проблема исчезает, когда я не перенаправить стандартный вывод. То есть, если я закомментирую строку
sys.stdout = StdoutRedirector(outputPanel)
IDLE отображает операторы печати в режиме реального времени. Может кто-нибудь объяснить мне это и предложить способ обойти это? Заранее спасибо!
Вот мой пример кода:
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