我正在尝试使用Windows 7上的Python 2.7.2将stdout实时重定向到Tkinter Text小部件。在我的下面的代码中,我打算每2秒在Text小部件中显示一个print语句。相反,会发生的是所有3行
Received sleep-command
Going to sleep for 2 s
Just woke up
一旦评估了sleep()和mod1.main(),就会同时出现。
令人惊讶的是(至少对我而言)当我不重定向stdout时问题就消失了。也就是说,如果我注释掉这一行
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
答案 0 :(得分:5)
在每个sleepBtn.update_idletasks()
命令之前调用time.sleep(2)
。否则,在睡眠过程结束之前不会更新视图。
答案 1 :(得分:0)
我创建了一个类,它将stdout写调用复制到tkinter小部件,无论是Label还是Text。适用于Python3.3.1 / WindowsXp。:
答案 2 :(得分:0)
而不是sleepBtn.update_idletasks()
,这可能是一个更简洁的解决方案:
穿戴
self.text_area.update_idletasks()
之前
self.text_area.insert(END, str)