一.ImportError: cannot import name '_imagingtk'
問題描述
使用tkinter畫pillow生成的圖片時,在tkinter中丟擲此異常。
解決方案
pip install -I --no-cache-dir Pillow
更新pillow
重啟解決一切問題,重新安裝解決一切問題
二.tkinter畫圖片不起作用
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++不協調。