我正在尝试在Windows 7上使用Python 2.7.2将stdout实时重定向到Tkinter Text小部件中。在下面的代码中,我打算让print语句每2秒出现在Text小部件中。相反,所有三行
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
sleepBtn.update_idletasks()在每个time.sleep(2)命令之前调用。否则,在睡眠过程结束之前不会更新视图。
sleepBtn.update_idletasks()
time.sleep(2)