Ошибка отображения картинки в tkinter
Решил попробовать написать крестики нолики, но при вставке нолика происходит какой то баг из-за которого вместо картинки нолика отображатеся белый фон Код:
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()
Источник: Stack Overflow на русском