How to copy a picture from Tkinter canvas to clipboard?

Tkinter is a popular Python library used for creating graphical user interfaces (GUIs). While copying text to the clipboard is straightforward, copying images from a Tkinter canvas requires additional steps. In this article, we will explore how to copy a picture from a Tkinter canvas to the clipboard using the Pillow library and the win32clipboard module.

Prerequisites

Before we start, ensure you have the required packages installed ?

pip install pillow
pip install pywin32

Note: The pywin32 package is needed for Windows clipboard operations with images.

Method 1: Using win32clipboard (Windows)

This method works specifically on Windows systems and provides reliable clipboard functionality for images ?

import tkinter as tk
from PIL import Image, ImageTk
import win32clipboard
from io import BytesIO

# Create main window
root = tk.Tk()
root.title("Copy Canvas Image to Clipboard")
root.geometry("500x400")

# Create canvas
canvas = tk.Canvas(root, width=300, height=200, bg="white")
canvas.pack(pady=20)

# Draw some shapes on canvas for demonstration
canvas.create_rectangle(50, 50, 150, 100, fill="blue", outline="black")
canvas.create_oval(180, 60, 250, 130, fill="red", outline="black")
canvas.create_text(150, 170, text="Sample Canvas", font=("Arial", 12))

def copy_canvas_to_clipboard():
    # Get canvas coordinates
    x = root.winfo_rootx() + canvas.winfo_x()
    y = root.winfo_rooty() + canvas.winfo_y()
    x1 = x + canvas.winfo_width()
    y1 = y + canvas.winfo_height()
    
    # Take screenshot of canvas area
    import PIL.ImageGrab as ImageGrab
    image = ImageGrab.grab(bbox=(x, y, x1, y1))
    
    # Save to memory buffer
    output = BytesIO()
    image.save(output, format='BMP')
    data = output.getvalue()[14:]  # Remove BMP header for clipboard
    output.close()
    
    # Copy to clipboard
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    win32clipboard.CloseClipboard()
    
    print("Image copied to clipboard!")

# Add copy button
copy_button = tk.Button(root, text="Copy Canvas to Clipboard", 
                       command=copy_canvas_to_clipboard,
                       bg="lightblue", font=("Arial", 10))
copy_button.pack(pady=10)

root.mainloop()

Method 2: Using PostScript (Cross-platform)

This method converts the canvas to PostScript format and then to an image ?

import tkinter as tk
from PIL import Image, ImageTk
import tempfile
import os

root = tk.Tk()
root.title("Canvas to Clipboard - PostScript Method")
root.geometry("500x400")

canvas = tk.Canvas(root, width=300, height=200, bg="lightgray")
canvas.pack(pady=20)

# Create sample content
canvas.create_rectangle(40, 40, 140, 90, fill="green", outline="darkgreen", width=2)
canvas.create_oval(160, 50, 240, 120, fill="yellow", outline="orange", width=2)
canvas.create_text(150, 160, text="PostScript Method", font=("Arial", 11), fill="navy")

def copy_canvas_postscript():
    # Create temporary PostScript file
    ps_file = tempfile.mktemp(suffix=".ps")
    
    try:
        # Export canvas as PostScript
        canvas.postscript(file=ps_file, colormode='color',
                         width=canvas.winfo_width(),
                         height=canvas.winfo_height())
        
        # Convert PostScript to image using Pillow
        image = Image.open(ps_file)
        
        # For demonstration, save to a temporary PNG file
        # (In practice, you'd copy directly to clipboard)
        png_file = tempfile.mktemp(suffix=".png")
        image.save(png_file, "PNG")
        
        print(f"Canvas saved as: {png_file}")
        print("Image ready for clipboard operations!")
        
    except Exception as e:
        print(f"Error: {e}")
    finally:
        # Clean up PostScript file
        if os.path.exists(ps_file):
            os.remove(ps_file)

copy_ps_button = tk.Button(root, text="Export Canvas (PostScript)", 
                          command=copy_canvas_postscript,
                          bg="lightgreen", font=("Arial", 10))
copy_ps_button.pack(pady=5)

root.mainloop()

Method 3: Loading and Copying External Image

This method demonstrates loading an external image to canvas and copying it ?

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

root = tk.Tk()
root.title("Copy External Image from Canvas")
root.geometry("400x350")

canvas = tk.Canvas(root, width=200, height=150, bg="white")
canvas.pack(pady=20)

# Create a simple colored image programmatically
def create_sample_image():
    img = Image.new('RGB', (200, 150), color='lightblue')
    # Add some basic drawing
    from PIL import ImageDraw
    draw = ImageDraw.Draw(img)
    draw.rectangle([20, 20, 180, 130], fill='white', outline='black', width=2)
    draw.text((70, 70), "Sample", fill='black')
    return img

# Load image to canvas
sample_image = create_sample_image()
photo = ImageTk.PhotoImage(sample_image)
canvas.create_image(100, 75, image=photo)

def copy_loaded_image():
    # Since we have the original image, we can copy it directly
    output = BytesIO()
    sample_image.save(output, format='PNG')
    print("Image prepared for clipboard!")
    print(f"Image size: {sample_image.size}")

copy_loaded_button = tk.Button(root, text="Copy Loaded Image", 
                              command=copy_loaded_image,
                              bg="lightyellow", font=("Arial", 10))
copy_loaded_button.pack(pady=10)

root.mainloop()

Key Considerations

Method Platform Reliability Requirements
win32clipboard Windows only High pywin32 package
PostScript Cross-platform Medium PIL/Pillow
Screenshot Cross-platform High PIL.ImageGrab

Common Issues and Solutions

Canvas Content Not Visible: Ensure the canvas is fully rendered before taking a screenshot by using root.update().

Clipboard Access Errors: On Windows, make sure no other application is using the clipboard when your script runs.

Image Quality: PostScript conversion may affect image quality. For pixel-perfect copying, use the screenshot method.

Conclusion

Copying images from a Tkinter canvas to clipboard requires platform-specific approaches. Use win32clipboard for Windows systems or PostScript conversion for cross-platform compatibility. The screenshot method provides the most reliable results for visible canvas content.

Updated on: 2026-03-27T16:04:57+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements