如何实时STDOUT进口模块重定向到Tkinter的文本控件在Python?(How to redi

2019-07-19 07:16发布

我想标准输出重定向到在Windows 7上使用Python 2.7.2在下面我的代码实时Tkinter的文本小,我打算有一个打印语句出现在文本控件每2秒。 会发生什么,取而代之的,是所有的三线

Received sleep-command
Going to sleep for 2 s
Just woke up

一旦同时出现既睡眠()和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

Answer 1:

调用sleepBtn.update_idletasks()的每个前time.sleep(2)命令。 否则视图不会在睡眠过程结束之前更新。



Answer 2:

我做了该份标准输出写调用一个Tkinter的小部件类是其标签或文本。 对我的作品上Python3.3.1 / WindowsXP的:

https://stackoverflow.com/a/16460878/2334951



Answer 3:

代替sleepBtn.update_idletasks()这可能是一个整齐的解决方案:

self.text_area.update_idletasks()之前self.text_area.insert(END, str)



文章来源: How to redirect in real time STDOUT from imported module to Tkinter Text Widget in python?