在Tkinter中循环放置图像



我试图将一组图像放在Tkinter的水平行中。为此,我循环遍历一个列表,并从工作目录加载相应的图像。我根据索引乘以一定的间距来放置图像。然而,当我实际放置图像时,它们都被放置在最后一个位置上,而不是分开。计数值工作得很好,当iprint(spacing*(count+1))时,它输出正确的值,但当放置它们时,它们都聚集在最后一个位置。

这是否与Label()类有关?

for count, mood in enumerate(mood_options):
mood_img = Image.open(f"img/{mood}.png")
mood_img_copy = mood_img.resize(img_size, Image.ANTIALIAS)
mood_img_resized = ImageTk.PhotoImage(mood_img_copy)
mood_img_label = Label(root, image=mood_img_resized).place(relx=spacing*(count+1), rely=0.35)
print(spacing * (count + 1))

编辑:我已经使用了这个确切的方法来放置按钮,见下文:

for count, mood in enumerate(mood_options):
mood_btn = Button(root, text=mood.capitalize(), command=lambda mood=mood: register_mood(mood), width=7) 
.place(relx=(count + 1) * spacing, rely=0.5)

这个工作完美无缺,这让我想知道为什么它不能用图像,而不是按钮。

如果相同的逻辑适用于按钮,那么问题可能是图像被垃圾收集,在这种情况下,您不能将图像存储为某些类的属性以保存引用,因为在每次迭代中,每个图像将被覆盖,仅保留对最后一个图像的引用。同样的情况也发生在global上。所以我们要做的就是对一个列表进行追加。试试这样写:

lst = []
for count, mood in enumerate(mood_options):
mood_img = Image.open(f"img/{mood}.png")
mood_img_copy = mood_img.resize(img_size, Image.ANTIALIAS)
mood_img_resized = ImageTk.PhotoImage(mood_img_copy)
lst.append(mood_img_resized)
Label(root, image=mood_img_resized).place(relx=spacing*(count+1), rely=0.35)
print(spacing * (count + 1))

虽然它会更好地放置的东西使用grid放置它在一个类似网格的方式。如果您担心窗口的响应性,请查看weight:

from tkinter import *
root = Tk()
mood_options = ['a', 'b', 'c']
for count, mood in enumerate(mood_options):
Label(root, text=mood).grid(row=0,column=count,padx=50)
root.grid_columnconfigure(count,weight=1)
root.grid_rowconfigure(0,weight=1)
root.mainloop()

您的spacing是实际的像素空间量吗?如果是这样,就不要使用relx,只使用xrelx必须是介于0.0和1.0之间的浮点数

最新更新