5

我正在尝试使用 Windows 7 上的 Python 2.7.2 实时将标准输出重定向到 Tkinter Text 小部件。在下面的代码中,我打算每 2 秒在 Text 小部件中出现一个打印语句。相反,发生的是所有 3 行

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
4

3 回答 3

6

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

于 2013-02-05T15:18:36.713 回答
0

我创建了一个类,它将标准输出写入调用复制到 tkinter 小部件,无论是标签还是文本。在 Python3.3.1/WindowsXp 上为我工作:

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

于 2013-05-09T12:06:35.267 回答
0

而不是sleepBtn.update_idletasks(),这可能是一个更简洁的解决方案:

放在 self.text_area.update_idletasks() 前面 self.text_area.insert(END, str)

于 2016-02-28T10:56:58.677 回答