我正在尝试将函数的标准输出重定向到tkinter文本小部件。我遇到的问题是,它会将每一行写到一个新窗口中,而不是将所有内容都列出在一个窗口中。该函数扫描目录并列出任何0k文件。如果没有文件为0k,则将其打印出来。因此,问题在于,如果目录中有30个0k文件,它将打开30个窗口,每个窗口只有一行。现在,我知道问题出在哪里。如果您查看我的功能代码,Zerok()我会告诉您:
Zerok()
if os.stat(filename).st_size==0: redirector(filename)
我知道,每次os.stat看到文件为0k时,它都会将其发送到重定向器,这就是为什么每个文件都有一个新窗口的原因。我只是不知道如何解决它。完整的代码如下。谢谢您的帮助。
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()
解决方法很简单:不要创建多个重定向器。重定向器的全部目的是创建一次,然后普通打印语句将显示在该窗口中。
您需要对功能进行一些小的更改redirector。首先,它不应该调用Tk;相反,它应该创建一个实例,Toplevel因为tkinter程序必须恰好具有一个根窗口。其次,您必须将文本小部件传递到,IORedirector因为它需要知道要写入的确切小部件。
redirector
Tk
Toplevel
IORedirector
def redirector(inputStr=""): import sys root = Toplevel() T = Text(root) sys.stdout = StdoutRedirector(T) T.pack() T.insert(END, inputStr)
接下来,只应一次调用此函数。从那时起,要使数据出现在窗口中,您将使用普通print语句。
print
您可以在主要的代码块中创建它:
win = Tk() ... r = redirector() win.mainloop()
接下来,您需要修改write函数,因为它必须写入文本小部件:
write
class StdoutRedirector(IORedirector): '''A class for redirecting stdout to this Text widget.''' def write(self,str): self.text_area.insert("end", str)
最后,将Zerok函数更改为使用打印语句:
Zerok
def Zerok():…如果os.stat(filename).st_size == 0: print(filename)else:print(“该目录中没有空文件”)