这是一个Python初学者问题。
我想循环遍历父文件夹的几个子文件夹(子文件夹包含 jpg 和 txt 文件)。我想使用 Tkinter 显示图像。旁边应该有一个图像和下一个按钮 - 单击按钮时,应该加载列表中的下一个图像。
如何强制应用程序在每个图像上停止并等待用户 react ?
在下面的测试代码中,加载的图像来自循环中的最后一个目录(其他目录中的图像不会显示,尽管我可以在循环运行期间打印它们的名称)。
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()
最佳答案
我能想到的最简单的方法:
首先,创建一个方法display_next
,它将增加索引并在列表中显示与该索引关联的图像(假设该列表是文件名列表)。将列表查询包含在 try/except 子句中将使您捕获当您用完要显示的图像时发生的 IndexError
-- 此时您可以将索引重置为 -1 或任何您想要的值在那一点发生。
获取__init__
中的文件名列表并将某些索引初始化为-1(例如self.index=-1
)。
在__init__
中创建一个tk.Button,如下所示:
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()
编辑
我已经给出了如何实际对框架进行网格化的示例。在前面的示例中,初始化代码中有 self.grid
。这确实没什么作用。您获得结果的唯一原因是您继承自 Tkinter.Tk
,它会自动网格化。通常,最好的做法是在创建对象后进行网格化,因为如果您稍后回来并决定将该小部件放在不同 GUI 中的其他位置,那么这样做很简单。我还更改了类的名称以使用 CamelCase 与 PEP 8 一致...但如果您愿意,您可以将其更改回来。
关于python - 如何在 Tkinter 中循环显示 jpg 的子文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10599771/