Pygame错误地响应按钮点击

时间:2016-10-15 04:54:46

标签: python button pygame

我遇到了pygame的问题。我已经设置了一个窗口,可以非常快速地在屏幕上随机放置圆圈,仅用于测试目的。还有三个按钮:播放/暂停(来回切换,停止出现圆圈)以及增加速度和减小速度按钮。我对python或pygame不是很有经验,但是我已经想出了这个功能来在屏幕上创建一个可点击的按钮:

def makeButton(rect, color, hovercolor, text, textsize, textcolor):
    clicked = False
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN: 
            clicked = True

    mouse = pygame.mouse.get_pos()
    rect = pygame.Rect(rect)
    displaycolor = color
    if rect.collidepoint(mouse):
        displaycolor = hovercolor

    buttonSurface = pygame.draw.rect(gameDisplay, displaycolor, rect, 0)
    font = pygame.font.Font('freesansbold.ttf',textsize)
    TextSurf = font.render(text, True, textcolor)
    TextRect = TextSurf.get_rect()
    TextRect.center = rect.center
    gameDisplay.blit(TextSurf, TextRect)
    if clicked:
        return True        
    else:
        return False

这个功能绝对可以缩短和简化,但到目前为止它对我有用。我拿出了一大堆我认为没用的代码(有一个完全不同的代码块来悬停时渲染按钮,而不仅仅是改变显示颜色)。现在,每当我点击前面提到的三个按钮中的任何一个时,它似乎都会选择一个随机的按钮然后返回True,弄乱了程序的其余部分。例如,播放按钮会将速度提高一倍,按下降速会暂停,等等。有时它确实按预期进行,但似乎是随机的。

一些额外的信息,如果它有用:

- 每次打勾都会调用此函数三次。它在一个循环中,如果它返回true,则应该执行相应的动作(暂停或玩游戏,增加/减少速度)

- 播放/暂停按钮是一个按钮,可在绿色和“播放”之间切换。箭头和红色的暂停符号。它们是两个独立的按钮和功能,一次只执行其中一个。

- 我几乎没有课程经验,所以他们可能会更好地处理这种情况。

- 我能想到的唯一解释是这个问题是返回的布尔值在这个函数被使用的不同地方之间混淆了。我很确定问题出在这段代码中,但问我,我也会发布它所调用的地方。

1 个答案:

答案 0 :(得分:1)

" pygame.event.get()"一次接受一个事件,并*从需要处理的事件列表中清除它**。

因此,更具体地说,pygame.event.get()仅返回一次的每个事件。

看看以下代码:

clicked = False
for event in pygame.event.get():
    if event.type == pygame.MOUSEBUTTONDOWN: 
        clicked = True

调用此方法后,将删除所有事件。这是对代码的分析。假设当前有两个事件尚未处理,第一个是按下的键,另一个是按下的鼠标按钮。

  1. 第一个事件event.KEYDOWN被放入变量" event"
  2. 程序会检查" event" (当前等于event.KEYDOWN)等于event.MOUSEBUTTONDOWN。它们显然不是一回事,所以下一行会被跳过。
  3. 第二个事件event.MOUSEBUTTONDOWN被放入变量" event" 这会删除变量" event"中的内容,删除第一个事件。
  4. 程序会检查" event" (当前等于event.MOUSEBUTTONDOWN)等于event.MOUSEBUTTONDOWN。它是,所以它进入下一行...
  5. "点击"设置为True,并且for循环退出,因为没有剩余事件。
  6. 您现在应该更好地了解Pygame如何处理事件。

    您提供的功能(makeButton)也存在许多问题。你应该找一个python教程来学习其余的东西。我推荐一本名为" Hello World",由Carter和Warren Sande撰写的书。这本书有点过时了(教授Python 2.5),但它的代码仍然适用于Python 2.7,它是我能找到的为数不多的体面的Python书籍之一。

    我已将代码包含在您要执行的操作中。我不使用Rect对象,但是如果你想要它们,你可以更改代码以包含它们。我也没有包含文字,因为我的时间很短。而不是放置随机圆圈,这会在单击按钮时打印文本(到shell)。

    import pygame, sys
    pygame.init()
    screen = pygame.display.set_mode([640,480])
    clock = pygame.time.Clock()
    
    buttons = []
    #buttons = [[rect, color, hovercolor, hovering, clicked, msg]]
    
    def makeButton(rect, color, hovercolor, text):
        global buttons
        buttons.append([rect, color, hovercolor, False, False, text])
    
    makeButton([0,0,50,50], [0,127,0], [0,255,0], "Clicked Green")
    makeButton([50,0,50,50], [190,190,0], [255,255,0], "Clicked Yellow")
    makeButton([100,0,50,50], [0,0,127], [0,0,255], "Clicked Blue")
    
    while 1:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.MOUSEMOTION:
                mousepos = event.pos
                for a in range(len(buttons)):
                    if mousepos[0] >= buttons[a][0][0] and mousepos[0] <= buttons[a][0][0]+buttons[a][0][2] and mousepos[1] >= buttons[a][0][1] and mousepos[1] <= buttons[a][0][1]+buttons[a][0][3]:
                        buttons[3] = True
                    else:
                        buttons[3] = False
            if event.type == pygame.MOUSEBUTTONDOWN:
                mousepos = event.pos
                for a in range(len(buttons)):
                    if mousepos[0] >= buttons[a][0][0] and mousepos[0] <= buttons[a][0][0]+buttons[a][0][2] and mousepos[1] >= buttons[a][0][1] and mousepos[1] <= buttons[a][0][1]+buttons[a][0][3]:
                        buttons[4] = True
                    else:
                        buttons[4] = False
        for a in range(len(buttons)):
            if buttons[3] == 0:
                pygame.draw.rect(screen, buttons[1], buttons[0])
            else:
                pygame.draw.rect(screen, buttons[2], buttons[0])
            if buttons[4] == 1:
                buttons[4] = 0
                print buttons[5]
        pygame.display.flip()
    

    我还没有机会测试我刚输入的代码(使用学校计算机),但它应该可行。如果代码有任何问题,请发表评论,我会修复它。

    如果您不了解某些内容,请发表评论。不要放弃,你可以做到!