Кнопки Pygame не реагируют на щелчки

#python #python-3.x #button

Вопрос:

Я пытался заставить кнопку работать для игры с множественным выбором pygame, где после нажатия случайного вопроса вы попадете на страницу вопросов с 2 ответами, одним правильным, одним неправильным. Однако они ни на что не реагируют при нажатии, мой код можно увидеть ниже;

 import pygame
import random
pygame.init()

win = pygame.display.set_mode((1200, 600))

pygame.display.set_caption("History Game")

#Background Image Loading
bg = pygame.image.load('bg.jpg')
bgAus = pygame.image.load('bg_Aus.jpg')
bgEN = pygame.image.load('bg_EN.jpg')
bgIR = pygame.image.load('bg_IR.jpg')

WHITE = (255, 255, 255)
ACTIVE_COLOR = pygame.Color('blue')
INACTIVE_COLOR = pygame.Color('red')
FONT = pygame.font.Font(None, 50)

def draw_buttonStart(buttonStart, win):
    pygame.draw.rect(win, buttonStart['color'], buttonStart['rect'])
    win.blit(buttonStart['text'], buttonStart['text rect'])


def draw_buttonAus1(buttonAus1, win):
    pygame.draw.rect(win, buttonAus1['color'], buttonAus1['rect'])
    win.blit(buttonAus1['text'], buttonAus1['text rect'])
    
def draw_buttonAus2(buttonAus2, win):
    pygame.draw.rect(win, buttonAus2['color'], buttonAus2['rect'])
    win.blit(buttonAus2['text'], buttonAus2['text rect'])


def draw_buttonIR1(buttonIR1, win):
    pygame.draw.rect(win, buttonIR1['color'], buttonIR1['rect'])
    win.blit(buttonIR1['text'], buttonIR1['text rect'])

def draw_buttonIR2(buttonIR2, win):
    pygame.draw.rect(win, buttonIR2['color'], buttonIR2['rect'])
    win.blit(buttonIR2['text'], buttonIR2['text rect'])
    

def draw_buttonEN1(buttonEN1, win):
    pygame.draw.rect(win, buttonEN1['color'], buttonEN1['rect'])
    win.blit(buttonEN1['text'], buttonEN1['text rect'])

def draw_buttonEN2(buttonEN2, win):
    pygame.draw.rect(win, buttonEN2['color'], buttonEN2['rect'])
    win.blit(buttonEN2['text'], buttonEN2['text rect'])

def create_button(x, y, w, h, text, callback):
    text_surf = FONT.render(text, True, WHITE)
    button_rect = pygame.Rect(x, y, w, h)
    text_rect = text_surf.get_rect(center=button_rect.center)
    button = {
        'rect': button_rect,
        'text': text_surf,
        'text rect': text_rect,
        'color': INACTIVE_COLOR,
        'callback': callback,
        }
    return button

points = 0
def correct_answer():
    global points
    points  = 100
    print(points)

def wrong_answer():
    global points
    points -= 50
    print(points)

moveOn = 0
def move_on():
    global moveOn
    moveOn = 1
                        



win.blit(bg, (0, -200))

#Main Loop
over = False
while not over:
    score = FONT.render('Score: '   str(points), 1, (255,0,0))
    win.blit(score, (390, 10))
    pygame.display.flip()
    buttonStart = create_button(50, 50, 250, 80, 'Random', move_on)
    button_listStart = [buttonStart]
    draw_buttonStart(buttonStart, win)
    
    #Quits game if X is clicked
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

        elif event.type == pygame.MOUSEBUTTONDOWN:
            for button in button_listStart:
                if button['rect'].collidepoint(event.pos):
                    button['callback']()
                    print (moveOn)
                    randomQ = random.randint(1,3)
                    if int(randomQ) == 1:
                        print("1")
                        buttonAus1 = create_button(275, 400, 250, 80, '1606', correct_answer)
                        buttonAus2 = create_button(675, 400, 250, 80, '1723', wrong_answer)
                        button_listAus = [buttonAus1, buttonAus2]
                        win.blit(bgAus, (-400, 0))
                        draw_buttonAus1(buttonAus1, win)
                        draw_buttonAus2(buttonAus2, win)
                        for event in pygame.event.get():
                            if event.type == pygame.MOUSEBUTTONDOWN:
                                for button in button_listAus:
                                    if button['rect'].collidepoint(event.pos):
                                        button['callback']()
                                        print (points)


                            #Hover over button changes colour
                            elif event.type == pygame.MOUSEMOTION:
                                for button in button_listAus:
                                    if button['rect'].collidepoint(event.pos):
                                        button['color'] = ACTIVE_COLOR
                                    else:
                                        button['color'] = INACTIVE_COLOR
                                            

                    elif int(randomQ) == 2:
                        print ("2")
                        buttonEN1 = create_button(675, 400, 250, 80, '1715', correct_answer)
                        buttonEN2 = create_button(275, 400, 250, 80, '1789', wrong_answer)
                        button_listEN = [buttonEN1, buttonEN2]
                        win.blit(bgEN, (0, -150))
                        draw_buttonEN1(buttonEN1, win)
                        draw_buttonEN2(buttonEN2, win)
                        for event in pygame.event.get():
                            if event.type == pygame.MOUSEBUTTONDOWN:
                                for button in button_listEN:
                                    if button['rect'].collidepoint(event.pos):
                                            button['callback']()
                                            
                            #Hover over button changes colour                        
                            elif event.type == pygame.MOUSEMOTION:
                                for button in button_listEN:
                                    if button['rect'].collidepoint(event.pos):
                                        button['color'] = ACTIVE_COLOR
                                    else:
                                        button['color'] = INACTIVE_COLOR
                                                    
                                        
                    else:
                        print ("3")
                        buttonIR1 = create_button(275, 400, 250, 80, '1760', correct_answer)
                        buttonIR2 = create_button(675, 400, 250, 80, '1812', wrong_answer)
                        button_listIR = [buttonIR1, buttonIR2]
                        win.blit(bgIR, (-375, -20))
                        draw_buttonIR1(buttonIR1, win)
                        draw_buttonIR2(buttonIR2, win)
                        for event in pygame.event.get():
                            if event.type == pygame.MOUSEBUTTONDOWN:
                                for button in button_listIR:
                                    if button['rect'].collidepoint(event.pos):
                                        button['callback']()

                            #Hover over button changes colour
                            elif event.type == pygame.MOUSEMOTION:
                                for button in button_listIR:
                                    if button['rect'].collidepoint(event.pos):
                                        button['color'] = ACTIVE_COLOR
                                    else:
                                        button['color'] = INACTIVE_COLOR
 

Я блуждал, может ли это иметь какое-то отношение к циклу for, как и до того, как я объединил цикл for для основного цикла и функцию выхода, функция выхода вообще не работала, так что любая помощь приветствуется, спасибо.

Комментарии:

1. Пожалуйста, приведите минимальный рабочий пример вашей проблемы!

2. Согласен с @KlausD. Отладьте свой код в очень маленьком подмножестве кода, в котором все еще присутствует та же ошибка. Это намного проще в управлении. 🙂

Ответ №1:

попробуйте привязать свои кнопки к соответствующим действиям мыши.

Комментарии:

1. Спасибо за ответ, но не могли бы вы уточнить, что означает привязка кнопок к соответствующим действиям мыши, означает ли это левую, правую и среднюю кнопки мыши.