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

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6216484.html
Copyright © 2011-2022 走看看