Ich versuche, die Stdout einer Funktion zu einem tkinter Text Widget umleiten. Das Problem, mit dem ich konfrontiert bin, ist, dass es jede Zeile in ein neues Fenster schreibt, anstatt alles in einem aufzulisten. Die Funktion scannt ein Verzeichnis und listet alle Dateien auf, die 0k sind. Wenn keine Dateien 0k sind, wird das gedruckt. Das Problem besteht also darin, dass bei 30 0k-Dateien in einem Verzeichnis 30 Fenster mit jeweils einer einzelnen Zeile geöffnet werden. Jetzt weiß ich, was das Problem ist. Wenn Sie in meiner Funktion Code aussehen Zerok()
ich es sage:redirect stdout zu tkinter Text widget
if os.stat(filename).st_size==0:
redirector(filename)
Ich weiß, dass jedes Mal, os.stat eine Datei, die 0k sieht, ist es dann sendet das Redirector, deshalb ist es ein neues Fenster für jeden Datei. Ich habe nur keine Ahnung, wie ich es beheben kann. Kompletter Code unten. 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()
Dank Bryan, macht das meiste Sinn, aber ich bin in einigen Punkten verloren. – dennis
Dank @ Bryan Oakley, ich bin super neu zu Python und noch neuer zu Tkinter, so dass Ihre Hilfe und Geduld geschätzt wird. Das meiste macht Sinn, aber ich bin in einigen Punkten verloren. Erstens: "Sie müssen ein Text-Widget an IORedirector übergeben ..." Ich bin dort verloren, können Sie klären? Zweitens, Aufruf dieser Funktion ein einziges Mal und r = Redirector(). Ich verstehe nicht, wie das funktioniert und benutzt wird? – dennis
@Dennis: Ich habe meine Antwort so bearbeitet, dass sie ein Stück enthält, das ich vergessen habe hinzuzufügen - die 'write' Methode muss die Funktion zum Schreiben in die Textdatei verwenden. Was das Übergeben eines Text-Widgets anbelangt - der Umleitungspunkt ist für den Redirector der einzige, der auf etwas umleitet. Sie müssen ihm sagen, was das ist. In diesem Fall möchten Sie es zum Text-Widget umleiten. –