如何实时将 STDOUT 从导入的模块重定向到 Python 中的 Tkinter Text Widget? [英] How to redirect in real time STDOUT from imported module to Tkinter Text Widget in python?

查看:48
本文介绍了如何实时将 STDOUT 从导入的模块重定向到 Python 中的 Tkinter Text Widget?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆