python tkinter Canvas不显示图片的问题

本人不经常用python,偶尔写脚本的时候使用一下python,用什么功能网上现查。最近心血来潮,想写一个python实现的窗口界面,显示一些简单的控件和图片,其中显示图片踩了坑。

用的是tkinter中的Canvas控件。网上查了下很简单,用下面代码几句话就能搞定。

import tkinter as tk

def canvas_image():

    root = tk.Tk()

    input_canvas = tk.Canvas(root, bg = 'white', width = 300, height = 300)
    img = tk.PhotoImage(file=r"C:\Users\shenchunping\Desktop\123.png")
    input_canvas.create_image(150, 150, image=img)
    input_canvas.pack()

但是在使用的时候,什么都正常,就是显示不出来图片 。最后查了一下,有好多都说在input_canvas.pack()下面加一个root.mainloop()就正常了。说的是没错,能正常显示图片了,但是mainloop()函数阻塞啊,必须保证显示图片的代码和mainloop()显示在同一个代码块里,否则没有用,既想把显示图片的代码打包成一个函数都行不通。

通过分析,发现其根本原因是资源回收造成的。上述代码中img = tk.PhotoImage()调用完成之后,因为其是局部变量,跳出代码块(在这为canvas_image函数)之后,导致img被释放,然后后面再调用mainloop()就找不到img,导致图片不显示,最终的结果就相当于你没设置图片。

解决方式如下:

import tkinter as tk

def canvas_image():

    global img

    root = tk.Tk()

    input_canvas = tk.Canvas(root, bg = 'white', width = 300, height = 300)
    img = tk.PhotoImage(file=r"C:\Users\shenchunping\Desktop\123.png")
    input_canvas.create_image(150, 150, image=img)
    input_canvas.pack()

实际上就是将img定义成了全局变量,让函数退出后不回收img的资源。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕斯白狼

一个用心搞技术的路人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值