使用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