Image not showing in tkinter button

Question:

I created a button with an image in Tkinter, but the image isn’t showing, i can just see a blank space in the button. Maybe my OS is the problem. I have Linux Mint 21 Xfce Edition.

from tkinter import ttk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import dialog
from tkinter import *
from PIL import ImageTk, Image
from modules import fonts, buttons
import shutil
import os
virusscan_win = Tk()
        virusscan_win.title("Virus scan")
        virusscan_win.geometry('400x200+60+60')
        virusscan_win.configure(background="white")
        Message(text="The virus scanner gives them the ability to scan files, folders or their system for viruses and remove threats automatically.", width=250, font=fonts.sansserif_small, background = "white").place(x=10, y=10)
        safe_image=PhotoImage(file='./media/button.png')
        Button(master=virusscan_win, image=safe_image, text="Scan file").place(x=10, y=90)

Can anyone explain, what was wrong with my code? I already checked, is the file in the correct folder. the debugger also shows nothing.

Asked By: Wervice

||

Answers:

Python is notorious for aggressively garbage collecting image references, which leads to them being destroyed before the UI gets drawn. Something like this should work for getting an image onto a Button

from PIL import Image, ImageTk
from pathlib import Path


img_path = Path('C:/<path>/<to>/media/button.png')  # use the full path to your img file
with Image.open(img_path) as img: # open the image file
    img_tk = ImageTk.PhotoImage(img)  # get the image as a Tk object
button = Button(virusscan_win, image=img_tk)  # add image to button

Note that if your image is the wrong size for your button, you can resize it like so

img_tk = ImageTk.PhotoImage(img.resize(32, 32))  # or whatever size you need
Answered By: JRiggles