ttk/Python 中的按钮图像问题
Issue with Button Images in ttk/Python
我正在使用 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()
这是我找到的示例的合并 here, here,以及来自 Whosebug 上用户的示例。
提前感谢任何ideas/insight。
-肖恩
PhotoImage
与 garbage collector
有问题,如果它被分配给局部变量,它会删除图像。
将图像分配给 class 变量 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
The Tkinter PhotoImage Class
我正在使用 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()
这是我找到的示例的合并 here, here,以及来自 Whosebug 上用户的示例。
提前感谢任何ideas/insight。
-肖恩
PhotoImage
与 garbage collector
有问题,如果它被分配给局部变量,它会删除图像。
将图像分配给 class 变量 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
The Tkinter PhotoImage Class