Skip to content
Advertisement

Trying to resize image on 2nd window of Tkinter GUI

This code will open a main window with an image, then another window with the same image. Is there any way to resize the image to be smaller? (go to # !>>> IMAGE 2 (2nd window))

Here is the code:

from tkinter import ttk
from tkinter import *

root = Tk()
root.title('4 Dry Out')
# IMAGE 1 (1st window)
img=PhotoImage(file='4 Dry Out Logo.png')
Label(root,image=img).pack()
# window format
root.geometry("275x75")
root['bg']='blue'

class MainWin:
    # main window frame
    def __init__(self, master):
        mainFrame = Frame(master)
        mainFrame.pack()
        # main window title / button 
        self.titleLabel = Label(master, text="4 Dry Out e-Rental", bg="blue", fg="white", font=("Arial Black", 20))
        self.titleLabel.pack()
        self.Btn = Button(master, text="Water Damage Equipment", command=self.MenuWin, bg="navy", fg="white", font=("Roboto")).pack()
       
    # button: new window
    def MenuWin(self):
        self.record = Menu()
        self.record.win.mainloop()
        
class Menu:
    # new window frame 
    def __init__(self):
        self.win = Toplevel()
        self.frameFit = Frame(self.win)
        self.frameFit.pack()
        self.frameFit['bg']='blue'
    # !>>> IMAGE 2 (2nd window)
        photo = PhotoImage(file='4 Dry Out Logo.png')
        label = Label(self.win,image=photo)
        label.image = photo # reference!
        label.pack()
        # portal title 
        self.TitleLabel = Label(self.frameFit, text="e-Rental Portal", bg="blue", fg="white", font=("Arial Black",15)).pack()
        
# start / end             
winStart = MainWin(root)
root.mainloop()

Advertisement

Answer

I see Bryan Oakley has already posted an answer your question, but I’ll supplement it with my own, which also fixes several other problems (some related to this) I noticed in your code and shows how to resize the image without using PIL using the subsample() method Bryan mentioned in a comment under your related question that was closed as a duplicate.

You can find some documentation on it, copy(), zoom(), as well as the other methods of the Photoimage class has by using Python’s built-in help system from the Python console: i.e.

>>> import tkinter
>>> help(tkinter.PhotoImage)

It’s also in the source code of course.

Here’s the code in your question code with fixes:

from tkinter import ttk
from tkinter import *

#image_filename = '4 Dry Out Logo.png'
image_filename = '8-ball.png'  # I don't have your image.

root = Tk()
root.title('4 Dry Out')
# IMAGE 1 (1st window)
img = PhotoImage(file=image_filename)
Label(root,image=img).pack()
# window format
root.geometry("500x500")
root['bg'] = 'blue'

class MainWin:
    # main window frame
    def __init__(self, master):
        mainFrame = Frame(master)
        mainFrame.pack()
        # main window title / button
        self.titleLabel = Label(master, text="4 Dry Out e-Rental", bg="blue", fg="white",
                                font=("Arial Black", 20))
        self.titleLabel.pack()
        self.Btn = Button(master, text="Water Damage Equipment", command=self.MenuWin,
                          bg="navy", fg="white", font=("Roboto"))
        self.Btn.pack()

    # button: new window
    def MenuWin(self):
        self.record = Menu()
        self.record.win.mainloop()

class Menu:
    # new window frame
    def __init__(self):
        self.win = Toplevel()
        self.frameFit = Frame(self.win)
        self.frameFit.pack()
        self.frameFit['bg']='blue'
        # IMAGE 2 <<<
#        img = PhotoImage(file='4 Dry Out Logo.png')
        small_img = img.subsample(2)   # Smaller copy of global img size 50%
        Label(self.win, image=small_img).pack()
        self.lbl_image = small_img  # Save reference to local image object.
        # portal title
        self.TitleLabel = Label(self.frameFit, text="e-Rental Portal", bg="blue",
                                fg="white", font=("Arial Black", 15))
        self.TitleLabel.pack()

# start / end
winStart = MainWin(root)
root.mainloop()

I don’t have your 4 Dry Out Logo.png logo image, but here’s how things looked after clicking the button while running on my system using a substitute image .

screenshot

User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement