Pyton.Не выводится надпись в Canvas

Рейтинг: -2Ответов: 2Опубликовано: 01.04.2023
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. Не могу понять почему. Подскажите , пожалуйста, кто сможет.

Ответы

▲ 1

Использовал два ответа и всё заработало. Ниже кусочек кода.

def show_draw(self):
    self.start()
    self.create_text(
        150, 150,
        text="Ничья",
        font=("Areal", 20)
    )
    self.finish()

def reset(self):
    self.delete('all')
    self.draw_lines()
    self.state = [None] * 9

def start(self): # обновление в начале функции вывода результата
    self.update()
    self.after(500, self.delete('all'))

def finish(self): # обновление в конце функции вывода результата
    self.update()
    self.after(1000, self.reset())
▲ 0

Добавьте перед вызовом self.reset() self.update(), обновиться окно и появиться текст.