5

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
4

3 に答える 3

6

sleepBtn.update_idletasks()time.sleep(2)コマンドの前に呼び出します。そうしないと、スリープ手順が終了する前にビューが更新されません。

于 2013-02-05T15:18:36.713 に答える