Не грузиться окно с картинками custom tkinter

Мне задали сделать игру камень, ножницы, бумага (знаю, что слишком банально), однако я решил еще сделать визуализацию на python, так вот я написал один модуль, с игрой, и он спокойно запускается, а потом импортировал его в основной модуль, где будет что-то типо главного меню, и после нажатии на кнопку начать (которое создает окно и запускает его), окно запускается, но оно пустое, и выдает ошибку

Главное меню

from customtkinter import *
from window_game import WindowGame
from PIL import Image

class Main:
    def __init__(self) -> None:
        # настройка окна
        self.window = CTk()
        self.window.geometry('300x150')
        self.window.title("Главное меню")
        self.window._set_appearance_mode('dark')
        self.window.resizable(width=False, height=False) 
        
        # импортирование картинок
        self.start_img = CTkImage(Image.open('./типо игра/img/start.png'))
        self.close_img = CTkImage(Image.open('./типо игра/img/close_.jpg'), size=(20, 25))
        
        
        # создание кнопок
        self.start = CTkButton(self.window, text="Начать",image=self.start_img,command=self.start_game, font=CTkFont(family='Benzin-bold', size=20), text_color='black', fg_color='white', hover=False, bg_color='transparent') 
        self.close = CTkButton(self.window, text="Закрыть", image=self.close_img,command=self.close, font=CTkFont(family='Benzin-Bold', size=20), text_color='black', fg_color='white', hover=False, bg_color='transparent') 

    
            
    # я создаю здесь, ну и типо я не могу к ним обратиться из-за того, что после они удаляются
    def start_game(self):
        self.windowgame = WindowGame()
        self.windowgame.focus()
        self.windowgame.run()

    
    def close(self):
        try:
            self.windowgame.destroy()
            self.count_win_game -= 1
        except:
            pass
        self.window.destroy()
    


    def run(self):
        self.start.pack(pady=25)
        self.close.pack()
        self.window.mainloop()
    
if __name__ == '__main__':
    start = Main()
    start.run()

Игра

from customtkinter import *
from game import *
from PIL import Image
import tkinter


class WindowGame:
    def __init__(self) -> None:
        # настройка окна
        self.window = CTkToplevel()
        self.window.geometry('650x400')
        self.window.title("Игра")
        self.window._set_appearance_mode('dark')
        self.window.resizable(width=False, height=False)
        self.user = Game()
        
        # создание изображение

        self.paper_img = CTkImage(light_image = Image.open('./типо игра/img/paper.png'), size=(125, 91))
        self.stone_img = CTkImage(light_image = Image.open('./типо игра/img/stone.png'), size=(130, 91))
        self.scissors_img = CTkImage(light_image = Image.open('./типо игра/img//scissors.png'), size=(87, 91))
    
    


    # создание кнопок
        self.paper_b = CTkButton(self.window, image=self.paper_img,  command=self.paper, text=None, fg_color="transparent", hover=False, bg_color="transparent")
        self.stone_b = CTkButton(self.window, text=None,  command=self.stone, fg_color='transparent', image=self.stone_img, hover=False, bg_color="transparent")
        self.scissors_b = CTkButton(self.window, text=None,  command=self.scissors, image=self.scissors_img, fg_color='transparent', hover=False, bg_color="transparent")

        # создание заголовков и прочего
        self.balance = CTkLabel(self.window, font=CTkFont(family='Benzin-Bold', size=15), text=f'Баланс: {self.user.coins}')
        self.user_sign = CTkLabel(self.window ,image=self.paper_img, text=None)
        self.enemy_sign= CTkLabel(self.window ,image=self.paper_img, text=None)
        self.res = CTkLabel(self.window, text= 'Нет',  font=CTkFont(family='Benzin-Bold', size=15), anchor=CENTER, fg_color="transparent", bg_color="transparent")
        self.bet_entry = CTkEntry(self.window, placeholder_text='Ставка', font=CTkFont(family='Benzin-Bold', size=10), text_color='white', width=80, fg_color="transparent", bg_color="transparent")
        self.max = CTkLabel(self.window, text=10, font=CTkFont(family='Benzin-Bold', size=15), fg_color="transparent", bg_color="transparent")

    
            
    # вот это полное дерьмо типо, ну просто шлак реально
    def list_int(self, nums) -> int:
        result = 0
        for num in nums:
            result += num
        return result
    
  
    # выглядит, как костыль серьезно
    def choose_enemy_sign(self, enemy):
        if enemy == 'бумага':
            self.enemy_sign.configure(image=self.paper_img)
        if enemy == 'камень':
            self.enemy_sign.configure(image=self.stone_img)
        if enemy == "ножницы":
            self.enemy_sign.configure(image=self.scissors_img)
       
    def paper(self):
        if self.bet_entry.get() == '':
            return
        bet = int(self.bet_entry.get())
        self.main(self.user.main('бумага', bet))
        
            
    def stone(self):
        if self.bet_entry.get() == '':
            return
        bet = int(self.bet_entry.get())
        self.main(self.user.main('камень', bet))
        

    def scissors(self):
        if self.bet_entry.get() == '':
            return
        bet = int(self.bet_entry.get())
        self.main(self.user.main('ножницы', bet))
        
    
    def focus(self):
        self.window.focus()

    def main(self, result):
        if result[0] == 'Недостаточно коинов':
            self.res.configure(text = f'Не хватает')
            return
        
        if result[0] == 'Нет коинов':
            self.destroy()

        sign = result[3]
        self.res.configure(text = f'{result[0]}')
        self.balance.configure(text = f'Баланс: {self.list_int([result[1]])}')
        if int(self.max._text) < result[1]:
            self.max.configure(text=result[1])
        if sign == 'бумага':
            self.user_sign.configure(image=self.paper_img)
        if sign == 'ножницы':
            self.user_sign.configure(image=self.scissors_img)
        else:
            self.user_sign.configure(image=self.stone_img)
        self.choose_enemy_sign(result[2])
    
        
        
    def destroy(self):
        self.window.destroy()


    def run(self):
        self.stone_b.place(x=55, y=259)
        
        self.paper_b.place(x= 429, y= 259)
        
        self.scissors_b.place(x=240, y=259)
        
        self.res.place(x=282, y=125)
        
        self.balance.place(x=128, y=201)
        
        self.user_sign.place(x=77, y=93)
        
        self.enemy_sign.place(x=446, y=93)
        
        self.bet_entry.place(x=285, y=200)
        
        self.max.place(x=446, y=200)
        
        self.window.mainloop()
        
if __name__ == "__main__":
    main = WindowGame()
    main.run()

Ответы (1 шт):

Автор решения: vlados155

Вы создаёте 2 окна customtkinter. CTkImage добавляет изображение в первое окно. Если запустить окно игры отдельно, то всё сработает правильно, так как будет только одно окно CTk(). Чтобы добавить изображение именно в окно игры, сделайте это окно TopLevel. Желательно, чтобы все окна, кроме главного, были Toplevel. В официальной документации есть очень хороший пример, как можно создать окно верхнего уровня. Попробуйте изменить вашу программу в соответствии с ним.

→ Ссылка