簡體   English   中英

如何將實時STDOUT從導入模塊重定向到python中的Tkinter Text Widget?

[英]How to redirect in real time STDOUT from imported module to Tkinter Text Widget in python?

我試圖在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

在每個sleepBtn.update_idletasks() time.sleep(2)命令之前調用sleepBtn.update_idletasks() 否則,在睡眠過程結束之前不會更新視圖。

我創建了一個類,它將stdout寫調用復制到tkinter小部件,無論是Label還是Text。 適用於Python3.3.1 / WindowsXp:

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

而不是sleepBtn.update_idletasks() ,這可能是一個更簡潔的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM