【问题标题】:PYGAME only one button on a screen works [duplicate]PYGAME只有一个屏幕上的按钮有效[重复]
【发布时间】:2020-10-22 14:34:26
【问题描述】:

我创建了一个按钮功能,它可以工作,但如果我在屏幕上多次使用该功能,那么它只能在其中一个按钮上工作,我不知道为什么。

这是按钮功能的代码。

def button(x, y, w, h, action=None):

    mx, my = pygame.mouse.get_pos()

    for event in pygame.event.get():

        if x + w > mx > x and y + h > my > y:
            if event.type == pygame.MOUSEBUTTONDOWN:
                action()

这是我尝试使用它的代码,第一个启动游戏循环的按钮有效,但应该退出的按钮没有

def game_intro():

    intro = True

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        gameDisplay.blit(bg_resize,(0,0))
        gameDisplay.blit(play_resize,(100,150))
        gameDisplay.blit(quit_resize,(575,150))
                         

        button(100,150,393,393,game_loop)
        button(575,150,393,393,quit)


  
        pygame.display.flip()
        clock.tick(15)

【问题讨论】:

    标签: python function button pygame


    【解决方案1】:

    问题是,您有多个事件循环。 pygame.event.get() 获取所有消息并将它们从队列中删除。如果在多个事件循环中调用pygame.event.get (),则只有一个循环接收事件,但并非所有循环都接收所有事件。因此,似乎错过了一些事件。

    在应用程序循环中获取事件一次,并将事件列表 (event_list) 传递给 button 函数。
    此外,在鼠标事件(例如MOUSEBUTTONDOWN)的情况下,当前鼠标位置存储在pygame.event.Event 对象的pos 属性中(参见pygame.event 模块):

    def button(x, y, w, h, event_list, action=None):
    
        for event in event_list:
           
            if event.type == pygame.MOUSEBUTTONDOWN:
                mx, my = event.pos
                if x + w > mx > x and y + h > my > y:
                    action()
    
    def game_intro():
        intro = True
        while intro:
    
            event_list = pygame.event.get() # get list of events only once
    
            for event in event_list:
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()
    
        # [...]
    
        button(100, 150, 393, 393, event_list, game_loop)
        button(575, 150, 393, 393, event_list, quit)
    
        # [...]
    

    【讨论】:

    • 不确定是不是我做错了,但是当我输入event_list = pygame.event.get(): 时,它说:
    • 啊太棒了,虽然它现在作为 event_list 中的事件出现错误:TypeError: 'function' object is not iterable
    • 对不起,我对此还是很陌生,所以可能会犯一些简单的错误。我已将其添加到函数 def button(x, y, w, h, event_list, action=None) 并使用按钮 button(100,150,393,393, event_list, game_loop) 调用它,但仍然出现相同的错误
    • 是的,我没有更新函数的所有调用。感谢您的帮助
    • @jrsevans 谢谢。不客气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多