Как проверить pygame, когда мышь удерживается нажатой

Итак, в настоящее время мой код

import pygame

def main():
    pygame.init()

    size = width, height = 800,700
    backgroundColor = [0, 0, 255]


    screen = pygame.display.set_mode(size)

    screen.fill(backgroundColor)

    pygame.display.flip()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return
            if pygame.mouse.get_pressed()[0]:
                print event.pos

main()

Что я пытаюсь сделать, так это то, что пока пользователь удерживает мышь, записывается положение курсора. То, что у меня работает, за исключением случаев, когда вы нажимаете за пределы экрана, а затем снова нажимаете на экран, если выдает ошибку:

строка 23, в main print event.pos AttributeError: член события не определен

Как я могу получить те же результаты, что и этот код, но когда я нажимаю на экран и снова нажимаю, он не выдает ошибку?


person tysonsmiths    schedule 17.09.2014    source источник


Ответы (1)


Просто обработайте исключение:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            return
        if pygame.mouse.get_pressed()[0]:
            try:
                print event.pos
            except AttributeError:
                pass

Если вы распечатаете само event на каждой итерации, вы увидите, что вы получаете ActiveEvent при нажатии на окно в дополнение к обычным событиям MouseMotion:

<Event(4-MouseMotion {'buttons': (0, 0, 0), 'pos': (703, 14), 'rel': (10, -12)})>
<Event(4-MouseMotion {'buttons': (0, 0, 0), 'pos': (714, 1), 'rel': (11, -13)})>
<Event(1-ActiveEvent {'state': 1, 'gain': 0})>  # clicked off
<Event(1-ActiveEvent {'state': 1, 'gain': 1})>  # clicked on

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

person dano    schedule 17.09.2014
comment
Почему вы получаете местоположение мыши из события? Я думаю, что для этого есть функция get_pos(), поэтому вы можете полностью переместить этот код за пределы цикла событий. В качестве альтернативы вы можете проверить событие перемещения мыши. - person user3757614; 18.09.2014
comment
Потому что они проверяют, опущена ли мышь, а не перемещена ли она. - person KodyVanRy; 18.09.2014