Python Forum

Full Version: 8 image grid with automatical image resize by screen resolution
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello everybody,
i am very new in python and have a problem.
I use Python 3 on a Raspberry.
I wanted to have a little program what have an full width grid with 2 rows and 4 columns. The images inside every column i want to change by Gpio later. But i stuck at the grid with the images.
I wanted to show in every field an image. This works. I decided to show images inside label (i am not sure if this is correct way).
Now i have the problem that my window is full size. Depends on screen resolution. All my Images are 800 x 800. So i want to scale them down that i have in first row 4 images and in second row 4 images.
For example when i have 1024 screen width every image must be not more then 256px.
But exactly for this i dont find solution. I read a lot and tried several ways. But no success.
In the moment the images strech all and my grid is broken.

This is my actuall code:
# import tkinter module
from tkinter import *
from tkinter.ttk import *

# creating main tkinter window/toplevel
master = Tk()
# Turn of window frame
master.overrideredirect(1)
# getting screen's width & height in pixels
screen_width = master.winfo_screenwidth()
screen_height = master.winfo_screenheight()
# New Var with Geometry size
screen_resolution = str(screen_width)+'x'+str(screen_height)
# Set size for Window
master.geometry(screen_resolution)

# Grid settings
grid.rowconfigure(master, 0, weight=1)
grid.columnconfigure(master, 0, weight=1)

# Load images
# Row 1 Standard 
imgr1 = PhotoImage(file=r"images\close1.png")
imgr1s = imgr1.subsample(1, 1)
imgr1_1 = PhotoImage(file=r"images\close2.png")
imgr1_1s = imgr1_1.subsample(1, 1)
imgr1_2 = PhotoImage(file=r"images\close3.png")
imgr1_2s = imgr1_2.subsample(1, 1)
imgr1_3 = PhotoImage(file=r"images\close4.png")
imgr1_3s = imgr1_3.subsample(1, 1)

# Row 2 Standard 
imgr2 = PhotoImage(file=r"images\close5.png")
imgr2s = imgr2.subsample(2, 2)
imgr2_1 = PhotoImage(file=r"images\close6.png")
imgr2_1s = imgr2_1.subsample(2, 2)
imgr2_2 = PhotoImage(file=r"images\close7.png")
imgr2_2s = imgr2_2.subsample(2, 2)
imgr2_3 = PhotoImage(file=r"images\close8.png")
imgr2_3s = imgr2_3.subsample(2, 2)


# Row 1
# Set images in Row 1 by Label
Label(master, image=imgr1s).grid(row=0, column=0, pady=1, sticky=N+S+E+W)
Label(master, image=imgr1_1s).grid(row=0, column=1, pady=1, sticky=N+S+E+W)
Label(master, image=imgr1_2s).grid(row=0, column=2, pady=1, sticky=N+S+E+W)
Label(master, image=imgr1_3s).grid(row=0, column=3, pady=1, sticky=N+S+E+W)

# Row 2
# Set images in Row 2 by Label
Label(master, image=imgr2).grid(row=1, column=0, pady=1, sticky=N+S+E+W)
Label(master, image=imgr2_1).grid(row=1, column=1, pady=1, sticky=N+S+E+W)
Label(master, image=imgr2_2).grid(row=1, column=2, pady=1, sticky=N+S+E+W)
Label(master, image=imgr2_3).grid(row=1, column=3, pady=1, sticky=N+S+E+W)

# infinite loop which can be terminated  
# by keyboard or mouse interrupt 
mainloop() 
Hopefully somebody can bring me to right way.
Thx for help
Alexander
Alexander,
I have seen this done using the PIL module, it has a function to resize called thumbnail.
Instead of label they used a canvas object create_image. below is an function from a class I'm using to preview an icon image in my script hope it will point you in the right direction:
def change_icon(self, size=(40,40)): # size of the icon 40x40
        from PIL.ImageTk import PhotoImage, Image # 2 PIL objects
        self.can.delete('object')                 # removes exiting object from canvas
        pic_num= self.combo3.current()            # retrieves the index number drop down
        pic= self.photos[pic_num]                 # gets photo from list
        print(pic)
        img_dir= r'../PIL/images/'
        img_obj= Image.open(img_dir + pic)
        img_obj.thumbnail(size, Image.ANTIALIAS)
        self.parent.one= self.img = PhotoImage(img_obj) #to prevent garbage collect
        icon= self.can.create_image(100,40,image=self.img,
                                    anchor='center',
                                    tag='object')
        self.parent.update()                                 # self.parent is my Tk()
@AlexanderO Hey it would be nice if you folks using Tkinter would put that in your subject like others have -- it helps us non-Tkinters ignore something we cannot weigh in on -- thanks for your cooperation
You can easily use PhotoViewerPro to draw texts, lines, highlights, rectangles, ovals and callout objects on images, so it's very useful to you.