Tkinter从列表中创建具有不同图像的按钮

时间:2017-12-13 02:26:57

标签: python-3.x tkinter

我想从列表中创建按钮,我希望它们拥有自己的图像。 我试过这个,但只有最后创建的按钮工作。

liste_boutton = ['3DS','DS','GB']

for num,button_name in enumerate(liste_boutton):
    button = Button(type_frame)
    button['bg'] = "grey72"
    photo = PhotoImage(file=".\dbinb\img\\{}.png".format(button_name))
    button.config(image=photo, width="180", height="50")
    button.grid(row=num, column=0, pady=5, padx=8)

3 个答案:

答案 0 :(得分:0)

您的代码显示正常,但您需要保留图像effbot的参考,我也相信PhotoImage只能读取GIF and PGM/PPM images from files,所以您需要另一个库PIL似乎是一个好的选择。我使用谷歌搜索图像中的几个图像,它们被放在与我的.py文件相同的目录中,所以我稍微更改了代码。如果不小心,按钮的宽度和高度也可以切掉部分图像。

from Tkinter import *
from PIL import Image, ImageTk
type_frame = Tk()

liste_boutton = ['3DS','DS','GB']

for num,button_name in enumerate(liste_boutton):
    button = Button(type_frame)
    button['bg'] = "grey72" 
    # this example works, if .py and images in same directory
    image = Image.open("{}.png".format(button_name))
    image = image.resize((180, 100), Image.ANTIALIAS) # resize the image to ratio needed, but there are better ways
    photo = ImageTk.PhotoImage(image) # to support png, etc image files
    button.image = photo # save reference
    button.config(image=photo, width="180", height="100")
    # be sure to check the width and height of the images, so there is no cut off
    button.grid(row=num, column=0, pady=5, padx=8)

mainloop()

输出:   [https://i.stack.imgur.com/lxthT.png]

答案 1 :(得分:0)

只有最后一个按钮才有图像,因为它是唯一一个在全局范围内引用的图像,或者在特定情况下的任何范围内。按原样,您只有一个可参考的按钮和图像对象,即buttonphoto

简短的回答是:

photo = list()
for...
    photo.append(PhotoImage(file=".\dbinb\img\\{}.png".format(button_name)))

但是这仍然会有不好的做法。

答案 2 :(得分:0)

有了你的所有评论,我就能达到我的预期! 谢谢 !我是编程的新手,所以这不一定是最好的解决方案,但它可以工作

import tkinter as tk

root = tk.Tk()

frame1 = tk.Frame(root)
frame1.pack(side=tk.TOP, fill=tk.X)
liste_boutton = ['3DS','DS','GB']
button = list()
photo = list()
for num,button_name in enumerate(liste_boutton):
    button.append(tk.Button(frame1))
    photo.append(tk.PhotoImage(file=".\dbinb\img\\{}.png".format(button_name)))
    button[-1].config(bg="grey72",image=photo[-1], width="180", height="50")
    button[-1].grid(row=num,column=0)

root.mainloop()