Search code examples
pythonimagetkintertkinter-entry

Online Image not getting displayed in Tkinter


I'm trying to make an online image viewer in which you can open online images (from a link) in Tkinter. This is my code:

from tkinter import *
from PIL import ImageTk, Image
import requests
from io import BytesIO

root = Tk()

var = StringVar()
entry = Entry(root, textvariable=var)
entry.pack()


def add_image():
imagelab.config(image=WebImage(entry.get()).get())


Button(root, text='Go! ', command=add_image).pack()


class WebImage:
def __init__(self, url):
u = requests.get(url)
self.image = ImageTk.PhotoImage(Image.open(BytesIO(u.content)))

def get(self):
return self.image


imagelab = Label(root)
imagelab.pack()

root.mainloop()

In this, its all working, and no errors are coming. But, the image is not displayed. I think it is loaded, but not displayed.

Thanks!


Solution

  • Try this:

    from tkinter import *
    from PIL import ImageTk, Image
    import requests
    from io import BytesIO
    
    root = Tk()
    
    var = StringVar()
    entry = Entry(root, textvariable=var)
    entry.pack()
    
    webimages_list = []
    
    def add_image():
        image = WebImage(entry.get())
        webimages_list.append(image)
        imagelab.config(image=image.get())
    
    
    Button(root, text="Go!", command=add_image).pack()
    
    
    class WebImage:
        def __init__(self, url):
            u = requests.get(url)
            self.image = ImageTk.PhotoImage(Image.open(BytesIO(u.content)))
    
        def get(self):
            return self.image
    
    
    imagelab = Label(root)
    imagelab.pack()
    
    root.mainloop()
    

    It stores all of the WebImage objects in a list called webimages_list. That stops python from garbage collecting the WebImage objects.