I am trying to put an image into a window with ImageTk and PhotoImage. Below is the code:
import tkinter as tk
import random as r
from PIL import ImageTk, Image
window = tk.Tk()
HEIGHT = window.winfo_screenwidth()
WIDTH = window.winfo_screenheight()
RESOL = str(str(HEIGHT) + "x" + str(WIDTH+7) + "+" + str(-7) + "+" + str(0))
window.geometry(RESOL)
x = int(HEIGHT)/2
y = int(WIDTH)/2
updatex = HEIGHT + (0.6 * HEIGHT)
main = tk.Frame(window, height = WIDTH, width = HEIGHT)
main.configure(bg = "white", highlightthickness = 0)
main.place(x = x, y = y, anchor = "center")
Map = tk.Canvas(window, height = int((900 - int(x))) + int(900), width = int((900 - int(y))) + int(900), bg = "#44b863", highlightthickness = 0)
Map.place(x = updatex, y = int(y), anchor = "center")
p = tk.PhotoImage(file = "TitleForGameReal.png")
play_solo_image = tk.PhotoImage(file = "PlaySoloButton.png")
play_duo_image = tk.PhotoImage(file = "PlayDuoButton.png")
title = tk.Label(main, image = p, highlightthickness = 0, bd = 0)
title.place(relx = 0.5, rely = 0.35, anchor = "center")
class CustomButton:
    def __init__(self, image, master, height, width, bordercolor):
        self.master = master
        self.frame = tk.Frame(master, height = height, width = width, highlightthickness = 0)
        self.image = tk.Label(self.frame, image = image, borderwidth = 0, bg = "dark grey")
        self.bordercolor = bordercolor
    def put(self, x, y, command):
        self.x, self.y = x, y
        self.frame.place(relx = x, rely = y, anchor = "center")
        self.image.pack()
        def enter(event = "<Enter>"):
            self.image.config(borderwidth = 3)
        self.image.bind("<Enter>", enter)
        def leave(event = "<Leave>"):
            self.image.config(borderwidth = 0)
        self.image.bind("<Leave>", leave)
        def bind_command(event = "<Button-1>"):
            command()
        self.image.bind("<Button -1>", bind_command)
def solo():
    global x, y, updatex
    for i in range(int(int(int(HEIGHT/9))/2)):
        x -= 20
        updatex -= 20
        main.place(x = x, y = y, anchor = "center")
        Map.place(x = updatex, y = y, anchor = "center")
        main.update()
        Map.update()
    player_image = Image.open("Connector.png")
    player_image2 = ImageTk.PhotoImage(player_image)
    
    class Player:
        def __init__(self, hp, image):
            self.hp = hp
            self.image = tk.Label(Map, image = image)
            
            self.image.place(relx = 0.5, rely = 0.5, anchor = "center")
        def spawn(self):
            Map.create_image(updatex, y, image = self.image)
    player = Player(100, player_image2)
    player.spawn()
def duo():
    print("duo")
play_solo_image = tk.PhotoImage(file = "PlaySoloButton.png")
play_solo_button = CustomButton(image = play_solo_image, master = main, height = play_solo_image.height(), width = play_solo_image.width(), bordercolor = "grey")
play_solo_button.put(x = 0.39, y = 0.47, command = solo)
play_duo_button = CustomButton(image = play_duo_image, master = main, height = play_duo_image.height(), width = play_duo_image.width(), bordercolor = "grey")
play_duo_button.put(x = 0.61, y = 0.47, command = duo)
I will also leave the image as a reference, because I edited the photo to strictly have a transparent background in PhotoShop:

But this is the output I see:

Later I realized that I was also receiving an error, which may or may not have something to do with my issue:
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\offcampus\AppData\Local\Programs\Python\Python35\lib\idlelib\run.py", line 125, in main
    seq, request = rpc.request_queue.get(block=True, timeout=0.05)
  File "C:\Users\offcampus\AppData\Local\Programs\Python\Python35\lib\queue.py", line 172, in get
    raise Empty
queue.Empty
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "C:\Users\offcampus\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 1559, in __call__
    return self.func(*args)
  File "C:\Users\offcampus\Desktop\New folder\SurvivalGame.py", line 50, in bind_command
    command()
  File "C:\Users\offcampus\Desktop\New folder\SurvivalGame.py", line 75, in solo
    player.spawn()
  File "C:\Users\offcampus\Desktop\New folder\SurvivalGame.py", line 73, in spawn
    Map.create_image(updatex, y, image = self.image)
  File "C:\Users\offcampus\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2338, in create_image
    return self._create('image', args, kw)
  File "C:\Users\offcampus\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2329, in _create
    *(args + self._options(cnf, kw))))
_tkinter.TclError: image ".2469091717696.2469132063968" doesn't exist
I know this may have something to do with garbage collection, and I would normally save a reference of it, but the problem is I can't do that since it will tell me "you can't pack a PhotoImage".
This is the tutorial I used to make the image background transparent. It's not my video, so don't flag it as spam.
The problem is image option of Map.create_image(updatex, y, image = self.image) requires a PhotoImage instance but you're giving it a label, so to fix it just say.
class Player:
    def __init__(self, hp, image):
        self.hp = hp
        self.image = image #creating an instance variable
        self.pic = ImageTk.PhotoImage(self.image) #making an photoimage instance
        self.cv = Map.create_image(updatex, y, image = self.pic) #passing the photo image instance
        self.pic.image = self.pic #keeping a reference to the image
Hope this has solved the error, do let me know if any errors or doubts.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With