Pyton.Не выводится надпись в Canvas
import tkinter
from tkinter import Canvas
import random
import time
class TicTacToe(Canvas):
def __init__(self, window):
super().__init__(window, width=300, height=300)
self.state = [None] * 9
self.bind('<Button-1>', self.click)
def click(self, event):
column = event.x // 100
row = event.y // 100
index = row * 3 + column
if self.state[index] is None: # выбор ссвободной клетки для x
self.state[index] = 'x'
self.add_x(column, row)
if self.get_winner() == 'x_win':
self.show_win_x()
elif self.get_winner() == 'o_win':
self.show_win_o()
elif self.get_winner() == 'draw':
self.show_draw()
else:
self.bot_move() # переход хода к компьютеру
if self.get_winner() == 'x_win':
self.show_win_x()
if self.get_winner() == 'o_win':
self.show_win_o()
if self.get_winner() == 'draw':
self.show_draw()
def draw_lines(self): # разлиновка
self.create_line(100, 0, 100, 300, fill='grey')
self.create_line(200, 0, 200, 300, fill='grey')
self.create_line(0, 100, 300, 100, fill='grey')
self.create_line(0, 200, 300, 200, fill='grey')
def add_o(self, column, row): # рисует 0
self.create_oval(
column * 100 + 20,
row * 100 + 20,
column * 100 + 80,
row * 100 + 80,
width=5, outline='green'
)
def add_x(self, column, row): # рисует x
self.create_line(
column * 100 + 20,
row * 100 + 20,
column * 100 + 80,
row * 100 + 80,
fill='red', width=5
)
self.create_line(
column * 100 + 80,
row * 100 + 20,
column * 100 + 20,
row * 100 + 80,
fill='red', width=5
)
def bot_move(self): # выбор случайной свободной клетки для 0
while True:
index = random.randint(0, 8)
if self.state[index] is None:
self.state[index] = 'o'
row = index // 3
column = index - row * 3
self.add_o(column, row)
break
def win_list(self): # создаёт множество победных линий
st = self.state
list_win = {
(st[0], st[1], st[2]),
(st[3], st[4], st[5]),
(st[6], st[7], st[8]),
(st[0], st[3], st[6]),
(st[1], st[4], st[7]),
(st[2], st[5], st[8]),
(st[0], st[4], st[8]),
(st[2], st[4], st[6]),
}
return list_win
def get_winner(self):
if ('x', 'x', 'x') in self.win_list():
return 'x_win'
elif ('o', 'o', 'o') in self.win_list():
return 'o_win'
elif None in self.state:
return None
else:
return 'draw'
def show_win_x(self):
time.sleep(0.5)
self.delete('all')
self.create_text(
150, 150,
text="Крестик выиграл",
font=("Areal", 40)
)
self.reset()
def show_win_o(self):
time.sleep(0.5)
self.delete('all')
self.create_text(
150, 150,
text="Нолик выиграл",
font=("Verdana 14", 40)
)
self.reset()
def show_draw(self):
time.sleep(0.5)
self.delete('all')
self.create_text(
150, 150,
text="Ничья",
font=("Verdana 14", 40)
)
self.reset()
def reset(self):
time.sleep(2)
self.delete('all')
self.draw_lines()
self.state = [None] * 9
wind = tkinter.Tk() # coздали окно
game = TicTacToe(wind)
game.pack() # метод размещениия в окна на холсте
wind.title('TicTacToe')
game.draw_lines()
wind.mainloop()
Привет! Если закомментировать функцию reset, то текст выводится. Если оставить так , как есть, то надпись Крестики выиграли не видно , а сразу происходит выполнение функции reset. Не могу понять почему. Подскажите , пожалуйста, кто сможет.
Источник: Stack Overflow на русском