使用tkinter画pillow生成的图片时,在tkinter中抛出此异常。python
pip install -I --no-cache-dir Pillow
更新pillow
重启解决一切问题,从新安装解决一切问题canvas
tkinter画pillow图片的代码数组
import tkinter from PIL import Image, ImageTk window = tkinter.Tk() canvas = tkinter.Canvas(window) img=ImageTk.PhotoImage(Image.open("beauty/0.jpg")) canvas.create_image(0,0,image=img) canvas.pack() window.mainloop()
若是将建立ImageTk.PhotoImage的那句代码放到一个函数中,会出现十分奇葩的现象:图片不显示函数
import tkinter from PIL import Image, ImageTk def setImage(canvas): img = ImageTk.PhotoImage(Image.open("../beauty/0.jpg")) x = canvas.create_image(300, 300, image=img) return img window = tkinter.Tk() canvas = tkinter.Canvas(window, width=400, height=400, bg='green') setImage(canvas) canvas.pack() window.mainloop()
这是由于在setImage(canvas)函数结束返回后,img立马就被回收了。
我只想说:日了狗了才会遇到这种bug。
解决方法是:全部的PhotoImage在mainloop期间必须有引用指向它们。
能够将setImage中的img变量定义成全局变量,也能够在把setImage函数返回来的img保存起来,总之,必须有引用指向PhotoImage,不然立马回收。
这既然是Canvas的bug,那么Canvas该如何改变呢?定义一个数组,把本身画过的全部对象都保存起来。有多是Canvas底层是C++,致使python和C++不协调。oop