Advik
Advik

Reputation: 43

How to make an image clickable in Tkinter?

Currently, the code chooses images from a folder and displays it on the tkinter window. I can click 'Next image' to see the next image from the folder. I would like to make the images clickable, so that it take would take me to a specified link. I can make it clickable but not sure how to bind the different links to each image. It will get confusing if I were to randomize the images(planning to do this later)

import tkinter as tk
from tkinter.filedialog import askdirectory
import os

img_list = []

def save_to_list(event):
    click_loc = [event.x, event.y]
    print ("you clicked on", click_loc)
    img_list.append(click_loc)

def next_img():
    img_label.img = tk.PhotoImage(file=next(imgs))
    img_label.config(image=img_label.img)

root = tk.Tk()
root.geometry('500x500')
# Choose multiple images
img_dir = askdirectory(parent=root, initialdir="./yoga_Images/", title='Choose folder')
os.chdir(img_dir)
imgs = iter(os.listdir(img_dir))

img_label = tk.Label(root)
img_label.pack()
img_label.bind("<Button-1>",save_to_list)

btn = tk.Button(root, text='Next image', command=next_img)
btn.pack()

next_img()

root.mainloop()

Upvotes: 1

Views: 1949

Answers (1)

Glatinis
Glatinis

Reputation: 347

You can simply specify a image object when creating a button.

from PIL import Image, ImageTk
import tkinter as tk

def example():
    print("Clickable Image!")

root = tk.Tk()

image = Image.open("image.png")
btnPhoto= ImageTk.PhotoImage(image)

imgBtn = tk.Button(root, image=btnPhoto, command=example)
imgBtn.pack()

root.mainloop()

Here is some code if you want to make multiple clickable images, don't forget to specify your image directory (Apologies for using list comprehensions, I know they are somewhat confusing).

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


def example():
    print("Clickable Image!")


root = tk.Tk()

imgDir = "imgs"
images = [ImageTk.PhotoImage(Image.open(os.path.join(imgDir, imgName))) for imgName in os.listdir(imgDir)]

for img in images:
    imgBtn = tk.Button(root, image=img, command=example)
    imgBtn.pack()


root.mainloop()

Upvotes: 2

Related Questions