2

这是一个 Python 初学者的问题。
我想遍历父文件夹的几个子文件夹(子文件夹包含jpgtxt文件)。我想使用 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/except 子句中将让您捕捉到IndexError当您用完要显示的图像时发生的情况——此时您可以将索引重置为 -1 或您想要在该点发生的任何事情。

获取文件名列表__init__并将某些索引初始化为-1(例如self.index=-1)。

像这样创建一个 tk.Button __init__

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

另一个注意事项,您可以使用小部件的配置方法即时更新小部件(而不是一直重新创建它)。换句话说,将所有小部件创建移动到__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()

编辑

我已经给出了一个如何实际对 Frame 进行网格化的示例。在您之前的示例self.grid中,您的初始化代码中有。这真的什么都没做。你得到结果的唯一原因是因为你继承了Tkinter.Tk自动网格化的结果。通常,最好在创建对象后进行网格化,因为如果您稍后回来并决定将该小部件放在不同的 gui 中的其他位置,那么这样做很简单。我还更改了类的名称以使用与 PEP 8 一致的 CamelCase ...但是如果您愿意,可以将其更改回来。

于 2012-05-15T11:41:24.823 回答