如何实时将 STDOUT 从导入的模块重定向到 Python 中的 Tkinter Text Widget? [英] How to redirect in real time STDOUT from imported module to Tkinter Text Widget in python?
问题描述
我正在尝试在 Windows 7 上使用 Python 2.7.2 实时将标准输出重定向到 Tkinter 文本小部件.在下面的代码中,我打算每 2 秒在文本小部件中显示一个打印语句.相反,发生的是所有 3 行
I am trying to redirect stdout into a Tkinter Text widget in real time using Python 2.7.2 on Windows 7. In my code below, I intended to have a print statement appear in the Text widget every 2 seconds. What happens, instead, is that all 3 lines
Received sleep-command
Going to sleep for 2 s
Just woke up
一旦 sleep() 和 mod1.main() 都被评估,就会同时出现.
appear simultaneously as soon as both sleep() and mod1.main() have been evaluated.
令人惊讶的是(至少对我而言)当我不重定向 stdout 时,问题就消失了.也就是说,如果我注释掉这一行
Surprisingly (to me, at least) the problem disappears when I do not redirect stdout. That is, if I comment out the line
sys.stdout = StdoutRedirector(outputPanel)
IDLE 实时显示打印语句.有人可以向我解释这一点并提出解决方法吗?提前致谢!
IDLE displays the print statements in real time. Can somebody explain this to me and suggest a way to get around it? Thanks in advance!
这是我的示例代码:
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
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
推荐答案
在每个 time.sleep(2)
命令之前调用 sleepBtn.update_idletasks()
.否则视图不会在睡眠过程结束前更新.
Call sleepBtn.update_idletasks()
before each time.sleep(2)
command. Otherwise the view will not be updated before the end of the sleep procedure.
这篇关于如何实时将 STDOUT 从导入的模块重定向到 Python 中的 Tkinter Text Widget?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!