redirect stdout to tkinter text widget

Ich versuche, die Standardausgabe einer Funktion an ein tkinter-Text-Widget umzuleiten. Das Problem, auf das ich stoße, ist, dass jede Zeile in ein neues Fenster geschrieben wird, anstatt alles in einem aufzulisten. Die Funktion durchsucht ein Verzeichnis und listet alle Dateien mit einer Größe von 0 KB auf. Wenn keine Dateien 0k sind, wird dies gedruckt. Das Problem ist also, dass, wenn sich 30.000 Dateien in einem Verzeichnis befinden, 30 Fenster mit jeweils einer Zeile geöffnet werden. Jetzt weiß ich, wo das Problem liegt. Wenn du in meinen Funktionscode schaustZerok() Ich sage es:

if os.stat(filename).st_size==0:  
       redirector(filename)

Ich weiß, dass jedes Mal, wenn os.stat eine Datei mit dem Wert 0k sieht, diese an den Redirector gesendet wird. Aus diesem Grund wird für jede Datei ein neues Fenster angezeigt. Ich habe nur keine Ahnung, wie ich das beheben soll. Code unten vervollständigen. Danke für die Hilfe

import Tkinter
from Tkinter import *
import tkFileDialog

class IORedirector(object):
    '''A general class for redirecting I/O to this Text widget.'''
    def __init__(self,text_area):
        self.text_area = text_area

class StdoutRedirector(IORedirector):
    '''A class for redirecting stdout to this Text widget.'''
    def write(self,str):
        self.text_area.write(str,False)

def redirector(inputStr):
    import sys
    root = Tk()
    sys.stdout = StdoutRedirector(root)
    T = Text(root)
    T.pack()
    T.insert(END, inputStr)

####This Function checks a User defined directory for 0k files
def Zerok():
    import os
    sys.stdout.write = redirector #whenever sys.stdout.write is called, redirector is called.
    PATH = tkFileDialog.askdirectory(initialdir="/",title='Please select a directory')  
    for root,dirs,files in os.walk(PATH):  
     for name in files:  
      filename=os.path.join(root,name)  
      if os.stat(filename).st_size==0:  
       redirector(filename)
      else:
          redirector("There are no empty files in that Directory")
          break

#############################Main GUI Window###########################
win = Tk()
f = Frame(win)
b1 = Button(f,text="List Size")
b2 = Button(f,text="ZeroK")
b3 = Button(f,text="Rename")
b4 = Button(f,text="ListGen")
b5 = Button(f,text="ListDir")
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
l = Label(win, text="Select an Option")
l.pack()
f.pack()
b2.configure(command=Zerok)
win.mainloop()

Antworten auf die Frage(4)

Ihre Antwort auf die Frage