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()