tkinter Canvas画图片大坑总结
一.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画图片大坑总结的更多相关文章
- GUI tkinter (Canvas)绘图篇
from tkinter import * root = Tk()root.title("中国象棋棋盘手绘") can = Canvas(root,width = 400, hei ...
- Python-使用tkinter canvas绘制的电子时钟
#!/usr/bin/env python # -*- coding: utf-8 -*- from tkinter import * import math import threading imp ...
- Python Tkinter canvas oval原理
Ovals, mathematically, are ellipses, including circles as a special case. The ellipse is fit into a ...
- Tkinter画布-Canvas
Python - Tkinter画布-Canvas: Canvas是一个长方形的面积,图画或其他复杂的布局.可以放置在画布上的图形,文字,部件,或是帧 Canvas是一个长方形的面积,图画或其他复杂的 ...
- Python用Tkinter的Frame实现眼睛护士的倒计时黑色屏幕
import Tkinter,time class MyFrame(Tkinter.Frame): def __init__(self): Tkinter.Frame.__init__(self) s ...
- tkinter做一个简单的登陆页面
做一个简单的登陆页面 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("900x3 ...
- 基于tkinter的GUI编程
tkinter:tkinter是绑定了Python的TKGUI工具集,就是Python包装的Tcl代码,通过内嵌在Python解释器内部的Tcl解释器实现的,它是Python标准库的一部分,所以使用它 ...
- Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...
- tkinter做一个简单的登陆页面(十六)
做一个简单的登陆页面 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("900x3 ...
随机推荐
- Flask 学习(四)静态文件
Flask 学习(四)静态文件 动态 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件.理想情况下你的服务器已经配置好提供静态文件的服务. 在开发过程中, Flask 也能做 ...
- 学习笔记:A*算法
简易地图 如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个的小方 ...
- SVN使用小结
SVN是Subversion的简称.是一个开放源码的版本号控制系统.在它的管理下,文件和文件夹能够超越时空的限制,权且当作一种奇妙的"时间机器"吧. 基本功能 版本号控制 作为一个 ...
- Informatica 常用组件Filter之一 概述
转换类型:已连接.主动 过滤器转换允许您过滤映射中的行.通过过滤器转换从源转换传递所有的行,然后为转换输入过滤条件.所有过滤器转换中的端口均为输入/输出端口,只有符合条件的行才能通过过滤器转换. 在某 ...
- 修改一行SQL代码 性能提升了100倍
在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用 EXPLAN ANAL ...
- Android之TelephonyManager
在Android平台中,通过TelephonyManager可以访问与手机通讯相关的信息,比如设备信息.网络信息及SIM卡信息,同时还可以监听电话的相关状态.下面我们通过几个方面来说明Android平 ...
- iphone之使用讯飞语音sdk实现语音识别功能
1.首先下载讯飞sdk及文档:http://open.voicecloud.cn/ 2.学习里面的demo简单实现了一个小的语音识别功能 先做一个简单demo,看看识别效果.注:语音识别必须联网. 所 ...
- Openfire与XMPP协议
关于xmpp协议可以参考:http://www.jabbercn.org 什么是OpenFire Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议. ...
- [置顶] 【玩转cocos2d-x之二十】从CCObject看cocos2d-x的内存管理机制
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/13765639 再看CCObject,剔除上节的拷贝相关,以及Lua脚本相关的 ...
- CSDN日报20170310——《假如我是一行代码》
[程序人生]假如我是一行代码 作者:henry-hacker 我们不止一次在生活中听到"假如我如何如何,我会如何如何"的句式.而这种句式说出来的一般意义无非就是让我们站在还有一个角 ...