在 Tkinter 中循环放置图像
Placing Images in loop in Tkinter
我试图在 Tkinter 中水平放置一组图像。我通过遍历列表并从工作目录加载相应的图像来完成此操作。
我根据索引乘以一定的间距来放置图像。然而,当我实际放置图像时,它们都在最后一个位置彼此重叠放置,而不是间隔开。计数值工作正常,当我 print(spacing*(count+1))
它输出正确的值但是当放置它们时它们都聚集在最后一个地方。
这与 Label()
class 有关系吗?
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)
这完美无缺,这让我想知道为什么它不适用于图像,而不是按钮。
您的 spacing
是以像素为单位的 space 的实际数量吗?
如果是这样,请不要使用 relx
,只使用 x
。 relx
必须是介于 0.0 和 1.0 之间的浮点数。
如果相同的逻辑适用于按钮,那么问题可能是图像被垃圾收集了,在这种情况下,您不能将图像存储为某些 class 的属性来保存引用,因为在每次迭代中每张图片都将被覆盖,仅保留对最后一张图片的引用。 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
以类似网格的方式放置东西会更好。如果您担心 window 的响应能力,请查看 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()
我试图在 Tkinter 中水平放置一组图像。我通过遍历列表并从工作目录加载相应的图像来完成此操作。
我根据索引乘以一定的间距来放置图像。然而,当我实际放置图像时,它们都在最后一个位置彼此重叠放置,而不是间隔开。计数值工作正常,当我 print(spacing*(count+1))
它输出正确的值但是当放置它们时它们都聚集在最后一个地方。
这与 Label()
class 有关系吗?
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)
这完美无缺,这让我想知道为什么它不适用于图像,而不是按钮。
您的 spacing
是以像素为单位的 space 的实际数量吗?
如果是这样,请不要使用 relx
,只使用 x
。 relx
必须是介于 0.0 和 1.0 之间的浮点数。
如果相同的逻辑适用于按钮,那么问题可能是图像被垃圾收集了,在这种情况下,您不能将图像存储为某些 class 的属性来保存引用,因为在每次迭代中每张图片都将被覆盖,仅保留对最后一张图片的引用。 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
以类似网格的方式放置东西会更好。如果您担心 window 的响应能力,请查看 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()