Почему ключ события MOD_SHIFT не работает в PYGAME Mac

#python #pygame

Вопрос:

Я пытаюсь создать небольшую программу на python с помощью pygame, которая определяет, когда нажата клавиша shift, но она не работает, она не печатает отладочную печать, которую я туда вставил, вот мой код

 while running:
    screen.fill((0, 0, 0))
    x, y = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            rectangle = "green"
        if event.type == pygame.MOUSEBUTTONUP:
            rectangle = "red"
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.KMOD_SHIFT:
                modshift = "down"
                print("debug shift")
            if event.key == pygame.KMOD_CTRL:
                modctrl = "down"
        if event.type == pygame.KEYUP:
            if event.key == pygame.KMOD_SHIFT:
                modshift = "up"
 

Ответ №1:

Вместо использования if event.key == pygame.KMOD_SHIFT: попробуйте использовать:

 if event.mod amp; pygame.KMOD_SHIFT:
 

Документация довольно хорошо объясняет это здесь: https://www.pygame.org/docs/ref/key.html#key-modifiers-label

Информация о модификаторе содержится в атрибуте mod pygame.KEYDOWN и pygame.КЛЮЧЕВЫЕ события. Атрибут mod — это битовая маска всех клавиш-модификаторов, которые находились в нажатом состоянии, когда произошло событие. Информация о модификаторе может быть декодирована с помощью побитового И (за исключением KMOD_NONE, который следует сравнивать с помощью equals ==).

В основном amp; оператор проверяет, pygame.KMOD_SHIFT была ли нажата кнопка.

Окончательный код будет выглядеть так:

 while running:
    screen.fill((0, 0, 0))
    x, y = pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            rectangle = "green"
        if event.type == pygame.MOUSEBUTTONUP:
            rectangle = "red"
        if event.type == pygame.KEYDOWN:
            if event.mod amp; pygame.KMOD_SHIFT:
                modshift = "down"
                print("debug shift")
            if event.mod amp; pygame.KMOD_CTRL:
                modctrl = "down"
        if event.type == pygame.KEYUP:
            if event.mod amp; pygame.KMOD_SHIFT:
                modshift = "up"
 

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

1. Рад это слышать!

2. но теперь я в замешательстве, если я сохраню ключ KMOD_SHIFT, как если бы event.mod и pygame.KMOD_SHIFT не обнаруживали, что ключ поднимается, но если я переключу его на if event.key и pygame.KMOD_SHIFT, это произойдет?

3. Значит, это работает, когда вы нажимаете shift, но не работает, когда вы отпускаете кнопку shift?