Ошибка отображения картинки в tkinter

Рейтинг: 0Ответов: 0Опубликовано: 30.05.2023

Решил попробовать написать крестики нолики, но при вставке нолика происходит какой то баг из-за которого вместо картинки нолика отображатеся белый фон Код:

from tkinter import *
from PIL import ImageTk, Image
from functools import partial
from tkinter import messagebox

window = Tk()
window.title("water war")
window.configure(bg='#222831')
window.geometry("1024x768")

main_frame = Frame(window, bg='#222831')

frames = []
widgets = []


wins = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6]
]
users = []
typed = ['Крестик', 'Нолик']
typed_symbol = [ImageTk.PhotoImage(Image.open('./crestick.png')), ImageTk.PhotoImage(Image.open('./nolic.png'))] 
hod = 0

def select_name():
    users.clear()
    flag = False
    for i in widgets:
        if type(i) == Entry:
            name = i.get()
            if name == '':
                messagebox.showerror("Ошибка ввода имени", "Вы не ввели имя одного из пользователей")
                flag = True
            else:
                users.append(name)
    if flag == False:
        clear_widgets()
        clear_frames_and_widgets()
        create_area() 

def create_area():
    widgets.append(Label(child_frames, text=f'Ход игрока {users[0]} ({typed[0]})', bg='#222831', fg='#EEEEEE'))
    widgets[-1].grid(row=0, column=0, columnspan=2)
    frames.append(Frame(child_frames, width=60, height=30, bg='#222831', padx=5, pady=5))
    frames[-1].grid(row=1, column=0)
    for i in range(3):
        for j in range(3):
            btn = Button(frames[-1], width=5, height=3, bg='#222831', border=1)
            btn.config(command=partial(click, btn, i, j))
            widgets.append(btn)
            widgets[-1].grid(row=i, column=j)
    
def click(btn, row, col):
    global hod
    frame = 0
    for i in frames:
        if i ==  btn.master:
            frame = i
            break
    widgets.remove(btn)
    btn.destroy()
    widgets.append(Label(frame, image=typed_symbol[hod], width=40, height=40))
    widgets[-1].grid(row=row, column=col)

    for i in widgets:
        if type(i) == Label:
            hod = (hod+1)%2
            i.config(text=f'Ход игрока {users[hod]} ({typed[hod]})')
            break


def start():
    clear_widgets()
    for i in range(0, 2):
        frames.append(Frame(child_frames, width=100, height=50, bg = '#222831', padx=20, pady=20))
        frames[i].grid(row=0, column=i)
        widgets.append(Label(frames[i], text=f'Введите имя игрока {i+1}', font=5, bg='#222831', fg='#EEEEEE'))
        widgets.append(Entry(frames[i], width=20, bg='#222831', fg='#EEEEEE', border=2, highlightbackground="black"))
    widgets.append(Button(child_frames, text="Выбрать имена", command=select_name, bg='#222831', fg='#EEEEEE'))
    widgets[-1].grid(row=1, column=0, columnspan=2)
    for_pack(widgets[:-1])

def exit_():
    exit(0)

def for_pack(widgets): 
    for i in widgets:
        i.pack(pady=5)

def clear_frames_and_widgets():
    for i in frames:
        i.destroy()
    frames.clear()
    widgets.clear()

def clear_widgets():
    for i in widgets:
        i.destroy()
    widgets.clear()

def init():
    global child_frames
    child_frames = Frame(main_frame, bg='#222831')
    child_frames.place(relx=0.5, rely=0.5, anchor='center')
    widgets.append(Button(child_frames, text="Начать игру", command=start, bg='#393E46', fg='#EEEEEE', width=50))
    widgets.append(Button(child_frames, text="Выйти из игры", command=exit_, bg='#393E46', fg='#EEEEEE', width=50)))
    for_pack(widgets)


if __name__ == '__main__':
    init()
    main_frame.pack(fill='both', expand=True)
    window.mainloop()

Ответы

Ответов пока нет.