【问题标题】:strange behavior of tkinter with pil image [duplicate]带有pil图像的tkinter的奇怪行为[重复]
【发布时间】:2020-11-19 12:19:34
【问题描述】:

我只想在标签小部件中显示图像。我通过以下代码管理任务:

import tkinter as tk
from PIL import Image,ImageTk
import requests

root=tk.Tk()
url="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/500px-SNice.svg.png"
imageurl=requests.get(url, stream=True)
image=Image.open(imageurl.raw)
img = ImageTk.PhotoImage(image.resize(size=(500,500)))
origPictureBox = tk.Label(root, image=img, anchor=tk.NW, height=500, width=500)
origPictureBox.config(image=img)
origPictureBox.pack(side=tk.TOP)
root.mainloop()

但是,当我把主要任务放到一个函数中时,图片却没有显示出来:

import tkinter as tk
from PIL import Image,ImageTk
import requests

def initUI(root):
    url="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/500px-SNice.svg.png"
    imageurl=requests.get(url, stream=True)
    image=Image.open(imageurl.raw)
    img = ImageTk.PhotoImage(image.resize(size=(500,500)))
    origPictureBox = tk.Label(root, image=img, anchor=tk.NW, height=500, width=500)
    origPictureBox.config(image=img)
    origPictureBox.pack(side=tk.TOP)

root=tk.Tk()
initUI(root)
root.mainloop()

有人可以解释这种行为吗?如果要显示其他项目(按钮等),它们是可见的,它只是隐藏的图像。

如果我使用类而不是函数 initUI,也会发生同样的情况。

这是我在 stackOverflow 中的第一个问题,如果答案很明显,我很抱歉。

【问题讨论】:

    标签: python-3.x tkinter python-imaging-library


    【解决方案1】:

    你需要保持对图像的引用,否则它会被垃圾收集

    所以添加:

    l = tk.Label(root)
    l.image = img
    

    完整代码

    import tkinter as tk
    from PIL import Image,ImageTk
    import requests
    
    def initUI(root):
        url="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/500px-SNice.svg.png"
        imageurl=requests.get(url, stream=True)
        image=Image.open(imageurl.raw)
        img = ImageTk.PhotoImage(image.resize(size=(500,500)))
        l = tk.Label(root)
        l.image = img
        origPictureBox = tk.Label(root, image=img, anchor=tk.NW, height=500, width=500)
        origPictureBox.config(image=img)
        origPictureBox.pack(side=tk.TOP)
    
    root=tk.Tk()
    initUI(root)
    root.mainloop()
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多