栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

关于tkinter.Canvas 不显示图片的问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于tkinter.Canvas 不显示图片的问题

问题描述

本想使用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( ̄▽ ̄)ブ

如果以上内容帮到了你, 烦请点赞收藏, !!在此谢过!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/961356.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号