一.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++不协调。

最新文章

  1. myBatis+SpringMVC+Maven整合
  2. NPOI导入,导出
  3. 第一个python程序hello.py
  4. Unity 物理引擎动力学关节
  5. js获取中国日期-农历
  6. 济南学习 Day1 T3 am
  7. semantic
  8. bzoj 1176 Mokia(CDQ分治,BIT)
  9. [转] vim 正则表达式 很强大
  10. 14.5.7 Storing InnoDB Undo Logs in Separate Tablespaces 存储InnoDB Undo logs 到单独的表空间
  11. codeforces#1139E. Maximize Mex(逆处理,二分匹配)
  12. Mysql 5.7--ubuntu18.04 安装过程及遇到的问题
  13. Python标准库之textwrap模块
  14. Linux驱动之中断处理体系结构简析
  15. shell环境改变引起的命令提示符改变
  16. C# 集合 特殊集合
  17. hdu2609 最小表示法
  18. vue-devtools必备工具
  19. npm使用【转】
  20. 【BZOJ4388】JOI2012 invitation 堆+线段树+并查集(模拟Prim)

热门文章

  1. Linux命令大观
  2. ILMerge-GUI的使用
  3. 手写一个关于title属性自定义提示框解决浏览器(IE)不兼容问题
  4. svn 错误集锦续
  5. 如何在模板中引用参数类中的一个特定member
  6. linux安装scikit-learn
  7. 如何监控执行的SQL语句?
  8. [Node.js] Availability and Zero-downtime Restarts
  9. Linux:编译动态库时遇到的错误relocation R_X86_64_32 against `a local symbol'
  10. HAProxy的独门武器:ebtree