Проблема с анимацией в Pygame

Проблема с анимацией: при нажатии кнопки начинается анимация, при этом на экране пропадает и кнопка, и счёт, — остаётся только фон и анимация. После проигрывания анимации всё восстанавливается, как это исправить?

Код:

class Game():
    def __init__(self):
        pygame.init()
        pygame.font.init()
        self.my_font = pygame.font.SysFont('Comic Sans MS', 30)
        self.screen = pygame.display.set_mode((800, 700))
        pygame.display.set_caption("Byrmalda")
        self.bg_img = pygame.image.load("bg_img.png")
        self.back = pygame.transform.scale(self.bg_img, (800, 700))
        self.screen.blit(self.back, (0, 0))
        self.clock = pygame.time.Clock()
        self.FPS = 60
        self.temp = 0
        self.temp_score = 0
        self.default_score = 100

        self.rand = randint(65, 80)

        self.im_list_1 = [pygame.image.load("ph_2.png"), pygame.image.load("ph_apl.png"),
                          pygame.image.load("ph_1_grape.png")]

        # first photo
        self.im = Image(self, 200, 180, 500, 200, "ph_2.png")
        self.im_1 = Image(self, 360, 180, 500, 200, "ph_apl.png")
        self.im_2 = Image(self, 520, 180, 500, 200, "ph_2.png")

        # self.anim = Imanim(self, self.im_list_1)

    def spin(self):
        for i in range(self.rand + 2):
            self.rand_1 = random.randint(0, 2)
            self.rand_2 = random.randint(0, 2)
            self.rand_3 = random.randint(0, 2)

            self.screen.blit(self.im_list_1[self.rand_1], (200, 180))
            self.screen.blit(self.im_list_1[self.rand_2], (360, 180))
            self.screen.blit(self.im_list_1[self.rand_3], (520, 180))

            pygame.display.update()
            i += 1
            time.sleep(0.09)

    def start(self):
        while True:
            self.clock.tick(self.FPS)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            self.screen.blit(self.back, (0, 0))
            if self.temp == 0:
                self.im.blitmi()
                self.im_1.blitmi()
                self.im_2.blitmi()

            self.but = Button(205, 500, 400, 100, 'Spin', self.screen, self.spin)
            self.but.run()

            self.default_score -= 5
            self.text = f"score {self.default_score}"
            self.txt = self.my_font.render(self.text, False, (255, 255, 255))
            self.screen.blit(self.txt, (360, 75))

            pygame.display.flip()
            pygame.display.update()


if __name__ == '__main__':
    by = Game()
    by.start()

Ответы (1 шт):

Автор решения: CrazyElf

Потому что вы по кнопке начинаете крутить цикл, отдельный от основного вашего цикла обработки событий и отрисовки. По кнопке нужно выставлять некий статус, который уже обрабатывать в основном цикле. События не должны быть долгими и не должны прерывать основной цикл обработки событий и отрисовки. В общем, грубо говоря в методе spin выставляйте некую переменную, скажем spin_num, которая до этого была равна 0, в self.rand + 2 и в основном цикле while смотрите её значение и обрабатывайте так, как будто вы внутри цикла for находитесь, который у вас в методе spin.

В общем, что-то такое:

    def __init__(self):
        ...
        self.spin_num = 0
        ...
    ...

    def spin(self):
        self.spin_num = self.rand + 2

    ...
    def start(self):
        while True:
            ...

            if spin_num:
                self.rand_1 = random.randint(0, 2)
                self.rand_2 = random.randint(0, 2)
                self.rand_3 = random.randint(0, 2)

                self.screen.blit(self.im_list_1[self.rand_1], (200, 180))
                self.screen.blit(self.im_list_1[self.rand_2], (360, 180))
                self.screen.blit(self.im_list_1[self.rand_3], (520, 180))

                spin_num -= 1

            pygame.display.flip()
            pygame.display.update()
→ Ссылка