0

我试图在 Tkinter 的水平行中放置一组图像。我通过遍历一个列表并从工作目录加载相应的图像来做到这一点。我根据索引乘以一定的间距来放置图像。但是,当我实际放置图像时,它们都会在最后一个位置彼此重叠放置,而不是分开放置。计数值工作正常,当print(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)

这完美无瑕,这让我想知道为什么它不适用于图像而不是按钮。

4

2 回答 2

2

如果相同的逻辑适用于按钮,那么问题可能是图像被垃圾收集,在这种情况下,您不能将图像存储为某个类的属性以保存引用,因为在每次迭代中,每个图像都将被覆盖,保留引用仅最后一张图片。同样的事情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()
于 2021-10-22T16:55:01.490 回答
0

spacing的实际空间量是像素吗?如果是这样,请离开relx并且仅使用x. relx必须是介于 0.0 和 1.0 之间的浮点数。

于 2021-10-22T12:38:30.187 回答