Я могу щелкнуть вокруг своей кнопки, и она все еще активируется?

Я сделал 2 кнопки и заставил их отправлять сообщение «СТАРТ» или «ВЫХОД», когда я нажимаю на них, но диапазон, в котором я могу их щелкнуть, больше, чем фактическая кнопка, поэтому я могу щелкнуть вокруг кнопки, и она все еще работает. Он также отправляет оба сообщения при нажатии рядом с ними обоими. Я пробовал менять картинку, но она все равно делает то же самое. Я не знаю, что мне делать? Я новичок, пожалуйста, помогите.

Это мой основной:

import pygame
import button

window_width, window_height = 1000, 650

win = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption("My game!")

grey = (25, 25, 25)

FPS = 60

start_img = pygame.image.load("img/start_button.png")
exit_img = pygame.image.load("img/exit_button.png")

start_button = button.Button(250, 220, start_img, 1.2)
exit_button = button.Button(265, 350, exit_img, 1.2)

def draw_window():
    win.fill(grey)

def main():
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        draw_window()
        if start_button.draw_button(win):
            print("START")
        if exit_button.draw_button(win):
            print("EXIT")
        pygame.display.flip()

    pygame.quit()


if __name__ == "__main__":
main()

и это моя кнопка:

import pygame

class Button:
    def __init__(self, x, y, image, scale):
    width = image.get_width()
    height = image.get_height()
    self.image = pygame.transform.scale(image, ((width * scale), (height * scale)))
    self.rect = self.image.get_rect()
    self.rect.topleft = (x, y)
    self.clicked = False

def draw_button(self, surface):
    action = False

pos = pygame.mouse.get_pos()

if self.rect.collidepoint(pos):
    if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
    self.clicked = True
    action = True

if pygame.mouse.get_pressed()[0] == 0:
        self.clicked = False 


surface.blit(self.image, (self.rect.x, self.rect.y))
return action

Я не знаю, что это может быть, пожалуйста, дайте любое предложение, помощь приветствуется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С вашим кодом проблем нет, я его проверял. Проблема с изображениями кнопок. Вероятно, ваши изображения имеют большую прозрачную область. Вы можете компенсировать это, создав меньший прямоугольник попадания, используя get_bounding_rect().
См. также Как получить правильные размеры прямоугольника pygame, созданного из изображения

import pygame

class Button:
    def __init__(self, x, y, image, scale):
        width = image.get_width()
        height = image.get_height()
        self.image = pygame.transform.scale(image, ((width * scale), (height * scale)))
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.clicked = False
        self.hit_rect = self.image.get_bounding_rect()
        self.hit_rect.x += x
        self.hit_rect.y += y

    def draw_button(self, surface):
        action = False
        pos = pygame.mouse.get_pos()

        if self.hit_rect.collidepoint(pos):
            if pygame.mouse.get_pressed()[0] == 1 and self.clicked == False:
                self.clicked = True
                action = True

        if pygame.mouse.get_pressed()[0] == 0:
            self.clicked = False 


        surface.blit(self.image, (self.rect.x, self.rect.y))
        return action

Другие вопросы по теме