【发布时间】:2021-10-22 12:06:22
【问题描述】:
我正在尝试将一组图像放置在 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)
这完美无瑕,这让我想知道为什么它不适用于图像而不是按钮。
【问题讨论】:
-
我建议您使用
.pack或.grid以使放置更容易,因为您不需要计算任何东西并且Label是一个类而不是一个函数 -
在整个项目中我都在使用
.place,并将其与.pack或.grid结合使用都行不通。 -
首先你为什么使用
.place?其次,pack 和其他任何一个布局管理器可以在同一个容器中同时使用 -
我想我可以使用
.place更好地控制确切的位置。使用.pack,据我所知,您只能控制左侧、底部等。在迭代放置时使用.pack与.place相比似乎有点奇怪,因为可以选择确切的位置。 -
这与图像被“捆绑”无关,这仅仅是因为除了最后一张之外,您的所有图像都被垃圾收集并且不复存在。您必须在其所需的整个生命周期内保留对
PhotoImage对象的引用 - 但您在循环的每次迭代中都会覆盖mood_img_resized。
标签: python tkinter tkinter-label