Home > Back-end >  Make multiple images in grid canvas expand with window
Make multiple images in grid canvas expand with window

Time:01-26

I am trying to plot 2 images next to each other using Tkinter. I want to use Grid since I will position 10 images in a grid-like position.

In pack I can do it this way, what is the equivalent of that in the grid?

frame1.pack(fill=BOTH, expand=YES)

Here is my code

from tkinter import ttk, Canvas, BOTH, YES
import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.title("Widget Examples")

# Frame 1
frame1 = Canvas(root)
frame1.grid(row=0, column=0)
pilImage1 = Image.open("testImage.jpg")
image1 = ImageTk.PhotoImage(pilImage1)
frame1.create_image(0, 0, image=image1, anchor="nw")


# Frame 2
frame2 = Canvas(root)
frame2.grid(row=0, column=1)
pilImage2 = Image.open("testImage.jpg")
image2 = ImageTk.PhotoImage(pilImage2)
frame2.create_image(0, 0, image=image2, anchor="nw")
# Keep unchanged
root.mainloop()

CodePudding user response:

Here is an example that uses Label to show image and get the click coordinates too. You can also use nested loops to create the grid and place Label with grid geometry manager:

from tkinter import * # Better to use import tkinter as tk
from PIL import Image, ImageTk

root = Tk()

def click_cord(e):
    print(f'x coodinate of click: {e.x}')
    print(f'y coodinate of click: {e.y}')
    print()

img_path = ['path_to_img1','path_to_img2',...] # List with path of 10 images
tk_lst = [ImageTk.PhotoImage(Image.open(x)) for x in img_path] # ImageTk instances

for i in range(2): # Number of rows
    for j in range(5): # Number of columns
        lbl = Label(root,image=tk_lst[5*i j])
        lbl.grid(row=i,column=j)
        lbl.bind('<Button-1>',click_cord) # Bind left click to the label

root.mainloop()

If you are wondering what tk_lst[5*i j] is, it is just a way to index the list, tk_lst, in a nested loop, where the index variables, i and j, cannot be deduced as normal 0,1,2,3,... unless an expression is applied on it. The expression can be generalized as: column_count * current_row_iteration current_column_iteration

  •  Tags:  
  • Related