本人不经常用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的资源。