zoukankan      html  css  js  c++  java
  • 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++不协调。

  • 相关阅读:
    对比git rm和rm的使用区别
    Gerrit日常维护记录
    [原创]Gerrit中文乱码问题解决方案分享
    MySQL 高可用架构
    MySQL 高可用架构
    Android L开发指南
    如何使用GOOGLE高级搜索技巧
    Linux定时关机
    Android源码批量下载及导入到Eclipse
    怎样将Android SDK源码 导入到Eclipse中?
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6216484.html
Copyright © 2011-2022 走看看