Displaying images from url in tkinter

Displaying images in Tkinter GUI applications can greatly enhance the visual appeal and user experience. While Tkinter provides various tools for working with images, displaying images directly from a URL requires additional steps. In this article, we will explore how to fetch and display images from URLs in Tkinter using the Python Imaging Library (PIL). We'll learn how to handle URL requests, process the image data, and showcase the images within Tkinter windows.

Installing PIL Library

To display images from a URL in Tkinter, we need to use the PIL (Python Imaging Library) library. It provides powerful image processing capabilities and supports a wide range of image formats. To install PIL, you can use the following command

pip install Pillow

Once PIL is installed, we can proceed with the implementation.

Basic Example

Here's a simple example that fetches and displays an image from a URL ?

# Import necessary libraries
from PIL import ImageTk, Image
import tkinter as tk
import urllib.request
import io

def display_image_from_url(url):
    with urllib.request.urlopen(url) as u:
        raw_data = u.read()

    image = Image.open(io.BytesIO(raw_data))
    photo = ImageTk.PhotoImage(image)

    # Create a Tkinter window
    root = tk.Tk()
    root.title("Image from URL")

    # Create a label widget to display the image
    label = tk.Label(root, image=photo)
    label.pack()

    # Start the Tkinter event loop
    root.mainloop()

# Example usage
display_image_from_url("https://www.tutorialspoint.com/python_pillow/images/tutorials_point.jpg")

How It Works

Let's break down the code step by step ?

  • We import the necessary libraries ImageTk and Image from the PIL module, tkinter, urllib.request, and io.

  • The display_image_from_url function takes a URL as input.

  • We use urllib.request.urlopen() to fetch the image data from the specified URL.

  • The image data is read as raw bytes using read().

  • We create an Image object using Image.open(), passing a BytesIO object that wraps the raw data.

  • Using ImageTk.PhotoImage(), we create a Tkinter-compatible image object.

  • We create a Tkinter window and display the image using a Label widget.

Handling Exceptions

When fetching images from URLs, it's important to handle potential exceptions to prevent crashes. Here's an improved version with proper error handling ?

# Import necessary libraries
from PIL import ImageTk, Image
import tkinter as tk
import urllib.request
import io

def display_image_from_url(url):
    root = tk.Tk()
    root.title("Displaying Images from URL in Tkinter")
    root.geometry("700x400")
    
    try:
        with urllib.request.urlopen(url) as u:
            raw_data = u.read()
    except Exception as e:
        print(f"Error fetching image: {e}")
        # Display error message in the window
        error_label = tk.Label(root, text=f"Error fetching image: {e}")
        error_label.pack()
        root.mainloop()
        return

    try:
        image = Image.open(io.BytesIO(raw_data))
        photo = ImageTk.PhotoImage(image)
    except Exception as e:
        print(f"Error opening image: {e}")
        error_label = tk.Label(root, text=f"Error opening image: {e}")
        error_label.pack()
        root.mainloop()
        return

    # Create label and display image
    label = tk.Label(root, image=photo)
    label.pack()
    root.mainloop()

# Example usage
display_image_from_url("https://www.tutorialspoint.com/python_pillow/images/tutorials_point.jpg")

In this improved version, we use separate try-except blocks to handle different types of errors. If an exception occurs during fetching or processing, an error message is displayed in the window instead of crashing the application.

Resizing Images

Sometimes images from URLs might be too large for your window. Here's how to resize them ?

from PIL import ImageTk, Image
import tkinter as tk
import urllib.request
import io

def display_resized_image(url, width, height):
    root = tk.Tk()
    root.title("Resized Image from URL")
    
    try:
        with urllib.request.urlopen(url) as u:
            raw_data = u.read()
        
        image = Image.open(io.BytesIO(raw_data))
        # Resize the image
        resized_image = image.resize((width, height))
        photo = ImageTk.PhotoImage(resized_image)
        
        label = tk.Label(root, image=photo)
        label.pack()
        root.mainloop()
        
    except Exception as e:
        print(f"Error: {e}")

# Example usage - resize to 300x200 pixels
display_resized_image("https://www.tutorialspoint.com/python_pillow/images/tutorials_point.jpg", 300, 200)

Key Points

  • Always import io module to use BytesIO for handling raw image data

  • Use urllib.request.urlopen() to fetch data from URLs

  • Wrap operations in try-except blocks to handle network and image processing errors

  • Use ImageTk.PhotoImage() to make PIL images compatible with Tkinter

  • Consider resizing large images to fit your window dimensions

Conclusion

Displaying images from URLs in Tkinter requires the PIL library and proper error handling. Use urllib.request to fetch image data, PIL to process it, and ImageTk.PhotoImage() to display it in Tkinter widgets. This approach enables dynamic image loading from web sources in your GUI applications.

Updated on: 2026-04-02T17:20:15+05:30

3K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements