私は関数のstdoutをtkinterテキストウィジェットにリダイレクトしようとしています。 私が実行している問題は、すべてを1つにリストするのではなく、新しいウィンドウに各行を書き込むことです。 この関数はディレクトリをスキャンし、0kのファイルをリストします。 0kのファイルがない場合は、それを出力します。したがって、問題は、ディレクトリに30個の0kファイルがある場合、それぞれに1行の30個のウィンドウが開きます。 今、問題の内容を知っています。あなたは私の機能コードZerok()
に見れば、私はそれを言っています:stdoutをtkinterテキストウィジェットにリダイレクト
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()
ありがとうブライアン、これのほとんどは理にかなっていますが、私はいくつかの点で迷っています。 – dennis
おかげさまで@Bryan Oakley、私はPythonに新しくて、さらにTkinterに新しいので、あなたの助けと忍耐を感謝します。これのほとんどは理にかなっていますが、私はいくつかの点で迷っています。まず、「テキストウィジェットをIORedirectorに渡す必要があります...」私はそこに迷っています。次に、この関数を1回呼び出すとr = redirector()です。私はそれがどのように働いていて使用されていないのですか? – dennis
@Dennis:私は最初に追加することを忘れた部分を含むように私の答えを編集しました - 'write'メソッドはテキストファイルに書き込むために関数を使う必要があります。テキストウィジェットを渡す場合は、リダイレクタが何かにリダイレクトするのがポイントです。あなたはそれが何であるかを伝えなければなりません。この場合、テキストウィジェットにリダイレクトする必要があります。 –