Python TkInter在一个窗口中显示相邻图像的列表
我有一个文件夹的图像,我添加到一个列表和进程。在流程结束时,我希望在Python TkInter在一个窗口中显示相邻图像的列表,python,tkinter,Python,Tkinter,我有一个文件夹的图像,我添加到一个列表和进程。在流程结束时,我希望在TkInter窗口中显示相邻的图像,目前使用我的代码,仅显示文件夹中的最后一个图像。我也只使用一个面板来显示这些图像,并将图像列表传递给panel.image方法,但我认为这样做是错误的,因为它不起作用 images = list() for item in os.listdir(mypath): image = cv2.imread(os.path.join(mypath, item)) if image is
TkInter
窗口中显示相邻的图像,目前使用我的代码,仅显示文件夹中的最后一个图像。我也只使用一个面板来显示这些图像,并将图像列表传递给panel.image
方法,但我认为这样做是错误的,因为它不起作用
images = list()
for item in os.listdir(mypath):
image = cv2.imread(os.path.join(mypath, item))
if image is not None:
if image.shape[0] > image.shape[1]:
image = imutils.rotate_bound(image, 90)
images.append(image)
r = 400.0 / image.shape[1]
dim = (400, int(image.shape[0] * r))
resized = cv2.resize(image, dim, interpolation=cv2.INTER_AREA)
###[Image processing]###
imageslist = list()
original = Image.fromarray(resized)
original = ImageTk.PhotoImage(original)
imageslist.append(original)
if panelA is None:
for image in imageslist:
panelA = Label(image=image)
panelA.image = image
panelA.pack(side="top", padx=10, pady=10)
else:
for image in imageslist:
panelA.configure(image=image)
panelA.image = image
root = Tk()
panelA = None
root.mainloop()
更新
现在,使用下面的代码,所有图像都会显示(虽然是垂直的),但是每当我点击按钮重置循环时(为了处理另一个文件夹中的图像),第一个文件夹中的第一个图像会保留在那里,而其余的图像确实来自新文件夹,这是非常奇怪的,我真的不明白为什么会发生这种情况,我破坏了面板,我检查了列表,它包含了每次循环后新文件夹中的图像,但由于某种原因,第一个图像总是放在那里
if panelA is None:
# the first panel will store our original image
for image in imageslist:
panelA = Label(image=image)
panelA.image = image
panelA.pack(side="top", padx=10, pady=10)
# otherwise, update the image panels
else:
panelA.destroy()
for image in imageslist:
panelA = Label(image=image)
panelA.image = image
panelA.pack(side="top", padx=10, pady=10)
第一个循环是这样的:
第二个循环,图像取自另一个文件夹,第一个文件夹中的第一个图像仍在顶部,该图像不在新文件夹中,并且列表在第二个循环开始时已清除,因此它不是取自imageslist:
标签的
image=
选项只接受一个图像。您可能需要使用多个标签,使用PIL将图像合并为一个,或者使用不同的小部件,例如画布或文本,可以将多个图像插入其中。好的,您将所有图像放在完全相同的位置-最多一个是可见的。Tkinter中出现空白图像的通常原因是,您仅通过局部变量引用图像,并且在函数退出时它就被垃圾收集:您发布的代码实际上是在函数中吗?如果是这样,您需要将imageslist
存储为全局变量,或者作为某个对象或小部件的属性,只要图像可见,这些对象或小部件就会存在。为什么不直接使用grid
?或者将包装更改为“左”
。您可以通过更改迭代enumerate(iterable)
并使用索引来获取列索引。您可以编写一个函数来销毁标签,并使用文件夹中的第一个图像重新创建标签。那可能行得通。你为什么要用这样的图片?我的老板刚刚路过,看到这些照片,他脸上的表情令人不快。请用更好的照片。