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()
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()