@shegorbelix

Как предотвратить двойные нажатия?

У меня есть несколько разных окон. К примеру окно меню где находятся кнопки: "Начать игру", "Продолжить игру", "Настройки", и есть окно настройки. Когда я нажимаю на настройки на основном окне меню, меня перебрасывает на окно "Настройки" и там автоматом происходит нажатие на другую кнопку. Обьяснить как- то трудновато, но вот код.
Функция создания кнопок:
class ClickableSprite(pygame.sprite.Sprite):
    def __init__(self, player_image, x, y, size_x, size_y, callback):
        super().__init__()
        self.image = transform.scale(image.load(player_image), (size_x,size_y))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.callback = callback
 
    def update(self, events):
        for event in events:
            if event.type == pygame.MOUSEBUTTONUP:
                if self.rect.collidepoint(event.pos):
                    self.callback()
    def reset(self):
        win.blit(self.image, (self.rect.x, self.rect.y))

Кнопки созданы верно, с функциями ошибок нету.
Видео с проблемой: https://youtu.be/0XaFFahcxZQ
Вот как на видео я нажимаю на кнопку "Next page", меня перебрасывает на другое окно а там на том же месте находится кнопка "Вернуться назад" и она срабатывает, и так получается бесконечный цикл. Если кнопки переместить в разные углы такой проблемы не будет, но это будет некрасиво и это не выход.
На хабр пишу первый раз, просьба камнями не закидывать)
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Вопрос на засыпку: если объект-кнопка обработал событие, остальные объекты его тоже получат?
Если да, то именно такое поведение и будет наблюдаться. Надо как-то пометить, что событие уже было обработано элементом интерфейса. Либо изъять событие из очереди, либо как-то дать знать новому экрану, что события обрабатывать не надо.

Альтернативно, вызывай коллбэк только если элемент зафиксировал и нажатие и отпускание кнопки без выхода курсора за пределы элемента. Тогда "остаточного" события будет недостаточно для активации кнопки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы