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

tkinter Canvas画图片大坑总结的更多相关文章

  1. GUI tkinter (Canvas)绘图篇

    from tkinter import * root = Tk()root.title("中国象棋棋盘手绘") can = Canvas(root,width = 400, hei ...

  2. Python-使用tkinter canvas绘制的电子时钟

    #!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * import math import threading imp ...

  3. Python Tkinter canvas oval原理

    Ovals, mathematically, are ellipses, including circles as a special case. The ellipse is fit into a ...

  4. Tkinter画布-Canvas

    Python - Tkinter画布-Canvas: Canvas是一个长方形的面积,图画或其他复杂的布局.可以放置在画布上的图形,文字,部件,或是帧 Canvas是一个长方形的面积,图画或其他复杂的 ...

  5. Python用Tkinter的Frame实现眼睛护士的倒计时黑色屏幕

    import Tkinter,time class MyFrame(Tkinter.Frame): def __init__(self): Tkinter.Frame.__init__(self) s ...

  6. tkinter做一个简单的登陆页面

    做一个简单的登陆页面 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("900x3 ...

  7. 基于tkinter的GUI编程

    tkinter:tkinter是绑定了Python的TKGUI工具集,就是Python包装的Tcl代码,通过内嵌在Python解释器内部的Tcl解释器实现的,它是Python标准库的一部分,所以使用它 ...

  8. Tkinter 项目-屏保

    参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...

  9. tkinter做一个简单的登陆页面(十六)

    做一个简单的登陆页面 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("900x3 ...

随机推荐

  1. iOS开发-xCode代码托管到GitHub

    xCode默认的是由源代码管理工作Git,Android Studio内置的也有,之前写过两篇关于Window托管Android代码到GitHub的文章,一直想写篇关于Mac上托管代码的到文章,今天终 ...

  2. Container With Most Water leetcode java

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  3. 两个JS对象怎样才能相等

    在JS中,两个对象如何才能相等?下面的两个 Alert,只有一个输出true.  在JS中如何才能构造出两个JS对象相等? var prop1 = {asd:{def:'abc'}}; var pro ...

  4. Java基础(九):抽象类

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外, ...

  5. 【Storm】学习笔记

    Storm 1 基本概念 1.1 分布式.可扩展.高容错.实时流处理.跨语言 1.2 应用场景 1.2.1 实时分析 1.2.2 在线机器学习 1.2.3 分布式RPC 1.2.4 ETL数据抽取 1 ...

  6. C# AES加密解密

    完整代码: /****************************************************************** * 创建人:HTL * 创建时间:2015-04-1 ...

  7. python时间格式化及前推

    import datetime >>> (datetime.datetime.now() - datetime.timedelta(seconds = 300)).strftime( ...

  8. [Backbone]3. More detail on View

    Change the AppointmentView to have a top-level li tag (instead of the default div tag). var Appointm ...

  9. 重装上了Fedora8自带的MySQL5.0.45,再试,告捷!!

    MySql服务器IP是192.168.0.104,测试连接的笔记本IP为192.168.0.100. 以下命令说明两台机器的网络连接是通畅的: [root@bogon bin]# ping 192.1 ...

  10. (LeetCode 21)Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...