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