我在使用Python(3.5)中的ttk / tkinter搞砸了,而按钮也遇到了一些问题(特别是ttk.Button)。
无论我尝试什么,都无法终生获得图像显示在按钮上。
我有以下代码:
from tkinter import * from tkinter import ttk from PIL import Image, ImageTk class Example(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) master.title('Button Test') self.configure(padding='10 10 10 10') self.grid(column=0, row=0, sticky=(N, E, W, S)) buttonImage = Image.open('play.png') buttonPhoto = ImageTk.PhotoImage(buttonImage) myButton = ttk.Button(self, image=buttonPhoto, padding='10 10 10 10') myButton.grid(column=1, row=1, sticky=(E, W)) if __name__ == "__main__": root = Tk() example = Example(root) root.mainloop()
这是我在此处,此处以及在StackOverflow上的用户中找到的示例的组合。
预先感谢您的任何想法/见解。
-西恩
PhotoImage
garbage collector
如果将图像分配给局部变量,则会出现删除图像的问题。
将图像分配给类变量 self.buttonPhoto
self.buttonPhoto = ImageTk.PhotoImage(buttonImage)
充分:
from tkinter import * from tkinter import ttk from PIL import Image, ImageTk class Example(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) master.title('Button Test') self.configure(padding='10 10 10 10') self.grid(column=0, row=0, sticky=(N, E, W, S)) buttonImage = Image.open('play.png') # use self.buttonPhoto self.buttonPhoto = ImageTk.PhotoImage(buttonImage) # use self.buttonPhoto myButton = ttk.Button(self, image=self.buttonPhoto, padding='10 10 10 10') myButton.grid(column=1, row=1, sticky=(E, W)) if __name__ == "__main__": root = Tk() example = Example(root) root.mainloop()
或将图像分配给其他对象-它也应该停止garbage collector
。
即。
myButton.image = buttonPhoto
充分:
from tkinter import * from tkinter import ttk from PIL import Image, ImageTk class Example(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) master.title('Button Test') self.configure(padding='10 10 10 10') self.grid(column=0, row=0, sticky=(N, E, W, S)) buttonImage = Image.open('tplay.png') buttonPhoto = ImageTk.PhotoImage(buttonImage) myButton = ttk.Button(self, image=buttonPhoto, padding='10 10 10 10') myButton.grid(column=1, row=1, sticky=(E, W)) # assign image to other object myButton.image = buttonPhoto if __name__ == "__main__": root = Tk() example = Example(root) root.mainloop()
请参阅Note
页面结尾处的Tkinter PhotoImage类