tkinter GUI 按钮列表

tkinter GUI list of buttons

for emoji, descriptor in emoji_descriptor
    img = ImageTk.PhotoImage(Image.open("emojis/"+descriptor+".png"))
    b = Button(emojiApp, text = descriptor, 
               command=lambda x=emoji: appendEmoji(x), image=img)
    b.pack()

#after the list of buttons have  been made
for i in range(len(buttons)):
     buttons[i].grid(row = i//4, column = i%4)

其中 emoji_descriptor 可以是带有说明的表情符号对列表:

[(❤️,"red_heart"),
(,"wink_tongue_out"),
...]

在这种情况下,我有 20 个 emojis/descriptors,并且唯一显示图像且实际激活按钮的是列表中的最后一个。我从来没有为 python 使用过 GUI,所以我不完全确定如何解决这个错误...有什么建议吗?

我不能(轻松地)测试这个,因为你问题中的代码不够完整,无法运行,但我认为问题在于 img 变量的值被 for 循环。

解决这个问题可能很简单,只需将当前值作为默认参数传递给您定义的 lambda 函数——类似于您为 x=emoji 参数所做的捕获当前值的操作emoji 并将其传递给正在创建的匿名函数:

for emoji, descriptor in emoji_descriptor
    img = ImageTk.PhotoImage(Image.open("emojis/"+descriptor+".png"))
    b = Button(emojiApp, text=descriptor,
               command=lambda x=emoji, img=img: appendEmoji(x), image=img)  # CHANGED.
    b.pack()

如果这不起作用,另一种方法是保存当前 PhotoImage 值,方法是在创建后将其设为 Button 的属性:

for emoji, descriptor in emoji_descriptor
    img = ImageTk.PhotoImage(Image.open("emojis/"+descriptor+".png"))
    b = Button(emojiApp, text=descriptor,
               command=lambda x=emoji: appendEmoji(x), image=img)
    b.img = img  # ADDED to save value of img
    b.pack()