Python tkinter code doesn't run when inside a function
Your image is being garbage collected. This works.
import tkinter as tkfrom PIL import Image, ImageTkroot = tk.Tk()root.geometry("800x600")#store all images in this dict so garbage collection will leave them alone#it doesn't have to be named "images"; it just has to be a dictimages = dict()def display_rain(row=0, column=0): #create and store the image if it doesn't exist if 'rain_tk' not in images: #unless you are making mips of this image you should probably #~make it the proper size and get rid of the resize part image = Image.open("./images/rain_jpeg.jpg").resize((250,250), Image.ANTIALIAS) #you can add a name to reference the image by #this makes it cleaner than accessing the dict directly images['rain_tk'] = ImageTk.PhotoImage(image, name='rain') #make and return the label, in case you want to grid_forget it or change the image label = tk.Label(root, image='rain') #instead of image=images['rain_tk'] label.grid(row=row, column=column) return label #you can easily display this wherever you want by filling in the row and column arguments#as an example, this would be displayed at row1 column2rain_lbl = display_rain(1, 2) root.mainloop()