本想使用tkinter开发一个"蜘蛛纸牌"游戏, 但是在测试tkinter.Canvas上创建图像时却不显示图像.
测试代码如下:
from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image
class SpiderSolitaire(ttk.Frame):
def __init__(self, master: Tk, **kw):
super().__init__(master, **kw)
self.mainframe = ttk.Frame(master)
self.mainframe.grid(column=0, row=0, sticky=NSEW)
self.canvas = Canvas(self.mainframe, width=400, height=300, background='gray55')
self.canvas.grid(row=0, column=0, sticky=NS)
im = ImageTk.PhotoImage(Image.open('./images/Spades_1.png'))
self.canvas.create_image(30, 10, image=im, anchor='nw')
# 这两条线只是为了标明图片要显示的位置.
self.canvas.create_line(30, 10, 98, 113, fill='red', width=3)
self.canvas.create_line(30, 113, 98, 10, fill='red', width=3)
# set window's title.
self.master.title('Spider Solitaire')
# set window's geometry size
self.master.geometry('400x300')
if __name__ == '__main__':
root = Tk()
SpiderSolitaire(root)
root.mainloop()
运行结果如下, 图片未显出出来.
在stackoverflow上找到了相同的问题描述, 里面给出了一个可行的解决方法. 但没有给出此问题的解释. 在其他文章中有说是内存回收的问题, 这种说法还是相对靠谱的.
将导入的图片先赋给一个"持久变量", 比如创建一个self.image用来持有导入的PhotoImage, 这样图片就不会被当垃圾回收掉. 如果有多个图片可以创建一个列表来持有.
修改上述测试代码如下:
from tkinter import *
from tkinter import ttk
from PIL import ImageTk, Image
class SpiderSolitaire(ttk.Frame):
def __init__(self, master: Tk, **kw):
super().__init__(master, **kw)
self.mainframe = ttk.Frame(master)
self.mainframe.grid(column=0, row=0, sticky=NSEW)
self.canvas = Canvas(self.mainframe, width=400, height=300, background='gray55')
self.canvas.grid(row=0, column=0, sticky=NS)
# bug fixed: 修改以下两行即可.
self.image = ImageTk.PhotoImage(Image.open('./images/Spades_1.png'))
self.canvas.create_image(30, 10, image=self.image, anchor='nw')
# 这两条线只是为了标明图片要显示的位置.
self.canvas.create_line(30, 10, 98, 113, fill='red', width=3)
self.canvas.create_line(30, 113, 98, 10, fill='red', width=3)
# set window's title.
self.master.title('Spider Solitaire')
# set window's geometry size
self.master.geometry('400x300')
if __name__ == '__main__':
root = Tk()
SpiderSolitaire(root)
root.mainloop()
运行结果如下, 如片确实被显示出来了!o( ̄▽ ̄)ブ
如果以上内容帮到了你, 烦请点赞收藏, !!在此谢过!!



