2

Python初心者の質問です。
親フォルダーのいくつかのサブフォルダーをループしたい (サブフォルダーにはjpgファイルとtxtファイルが含まれる)。Tkinter を使用して画像を表示したい。横に画像と[次へ] ボタンがあるはずです。ボタンをクリックすると、リストから次の画像が読み込まれます。

各画像でアプリケーションを強制的に停止し、ユーザーの反応を待つ方法は?
以下のテスト コードでは、ロードされたイメージはループの最後のディレクトリからのものです (ループの実行中に名前を出力することはできますが、他のディレクトリのイメージは表示されません)。

import Tkinter, os, glob
from PIL import Image, ImageTk


class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid

        parentSrcFolder = r"D:\2012\RCIN\test"
        srcFoldersLst = os.listdir(parentSrcFolder)
        for srcFolder in srcFoldersLst:
            jpgFilesPathLst = glob.glob(os.path.join(parentSrcFolder, srcFolder, "*.jpg"))

            self.labelVariable = Tkinter.StringVar()
            label = Tkinter.Label(self,textvariable=self.labelVariable,anchor="w")
            label.grid(column=0,row=0,columnspan=2,sticky='EW')
            self.labelVariable.set(jpgFilesPathLst[0])

            cardImage = Image.open(jpgFilesPathLst[0])
            indexCard = ImageTk.PhotoImage(cardImage)
            labelImage = Tkinter.Label(self,image=indexCard)
            labelImage.image = indexCard
            labelImage.grid(column=0,row=3)

def main():
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()

if __name__ == '__main__':
    main()
4

1 に答える 1

4

私がこれを行うことを考えることができる最も簡単な方法:

まず、display_nextインデックスをインクリメントし、そのインデックスに関連付けられた画像をリストに表示するメソッドを作成します(リストがファイル名のリストであると想定します)。リストの問い合わせをtry/exception句で囲むと、IndexError表示する画像が不足したときに発生することがわかります。この時点で、インデックスを-1またはその時点で発生したいものにリセットできます。

のファイル名のリストを取得し、__init__いくつかのインデックスを-1に初期化します(例self.index=-1)。

次のようにtk.Buttonを作成します__init__

self.Button = Tkinter.Button(self,text="Next",command=self.display_next)

もう1つの注意点として、ウィジェットのconfigメソッドを使用して、ウィジェットをその場で更新できます(常に再作成するのではありません)。つまり、すべてのウィジェットの作成をに移動して__init__から、display_nextを使用してウィジェットを更新するだけconfigです。また、Tkinter.Frameから継承する方がおそらく良いでしょう...

class SimpleAppTk(Tkinter.Frame):
    def __init__(self,*args,**kwargs):
        Tkinter.Frame.__init__(self,*args,**kwargs)

        self.filelist=[]  #get your files here
        #it probably would look like:
        #for d in os.listdir(parentDir):
        #    self.filelist.extend(glob.glob(os.path.join(parentDir,d,'*.jpg'))
        self.index=-1
        self.setup()
        self.display_next()

    def setup(self):
        self.Label=Tkinter.Label(self)
        self.Label.grid(row=0,column=0)
        self.Button=Tkinter.Button(self,text="Next",command=self.display_next)
        self.Button.grid(row=0,column=1)

    def display_next(self):
        self.index+=1
        try:
            f=self.filelist[self.index]
        except IndexError:
            self.index=-1  #go back to the beginning of the list.
            self.display_next()
            return

        #create PhotoImage here
        photoimage=...
        self.Label.config(image=photoimage)
        self.Label.image=photoimage

if __name__ == "__main__":
   root=Tkinter.Tk()
   my_app=SimpleAppTk(root)
   my_app.grid(row=0,column=0)
   root.mainloop()

編集

フレームを実際にグリッド化する方法の例を示しました。前の例ではself.grid、初期化コードがありました。これは本当に何もしませんでした。結果が得られた唯一の理由は、継承Tkinter.Tk元が自動的にグリッド化されるためです。通常、オブジェクトを作成した後にグリッド化するのがベストプラクティスです。後で戻ってきて、そのウィジェットを別のGUIの別の場所に配置することにした場合、そうするのは簡単だからです。また、PEP 8に準拠してCamelCaseを使用するようにクラスの名前を変更しました...ただし、必要に応じて元に戻すことができます。

于 2012-05-15T11:41:24.823 に答える