blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Pygame: zdarzenia KEYDOWN, KEYUP i funkcje get_pressed(), get_mods().

python pygame zdarzenia i funkcje dotyczące klawiszy

Zdarzenia KEYDOWN, KEYUP to pojedyńcze sygnały, które pojawiają się na początku i na końcu trzymania wciśniętego klawisza.

Funkcja pygame.key.get_pressed() dostarcza przez cały czas informację, że dany klawisz jest trzymany wciśnięty. Wykorzystuje do tego tablicę z wartościami True/False. Ta funkcja wymaga wywoływania (w pętli) funkcji pygame.event.get() lub pygame.event.pump() bo tylko wtedy może zakutalizować informacje dzięki zdarzeniom KEYDOWN i KEYUP.

Nie sposób z niej wyczytać w jakiej kolejności zostały wciśnięte kombinacje klawiszy. Niektóre klawiatury mogą powodować, że tylko pewna ilość wciśniętych klawiszy jest pamiętana - np. tylko dwa ostatnio wciśnięte klawisze - co powoduje, że nie sposób wychwycić wciśnięcie kombinacji kilku klawiszy.

Zdarzenia KEYDOWN, KEYUP:

esc_pressed = False

while True:

    for event in pygame.event.get():

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                print("Właśnie wciśnięto ESC")
                esc_pressed = True

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_ESCAPE:
                print("Właśnie puszczono ESC")
                esc_pressed = False

    if esc_pressed:
        print("ESC cały czas wciśnięty")

    #---

    keys = pygame.key.get_pressed()

    if keys[pygame.K_ESCAPE]:
        print("ESC cały czas wciśnięty")

Funkcja get_pressed():

while True:

    pygame.event.pump()
    # lub: pygame.event.get()

    keys = pygame.key.get_pressed()

    if keys[pygame.K_ESCAPE]:
        print("ESC cały czas wciśnięty")

[OT] Sprawdzanie klawiszy specjalnych

Przy sprawdzaniu klawiszy specjalnych wykorzystuje się binarne operacje & (AND), | (OR) i inne.

    pygame.event.pump()

    mods = pygame.key.get_mods()

    if mods & pygame.KMOD_SHIFT:
        print('SHIFT cały czas wciśnięty')

    if mods & pygame.KMOD_LSHIFT: # L
        print('lewy SHIFT cały czas wciśnięty')

    if mods & pygame.KMOD_RSHIFT: # R
        print('prawy SHIFT cały czas wciśnięty')

    if mods & (pygame.KMOD_SHIFT | pygame.KMOD_CTRL):
        print('SHIFT+CTRL cały czas wciśnięte')
  • KMOD_NONE
  • KMOD_LSHIFT, KMOD_RSHIFT, KMOD_SHIFT
  • KMOD_CAPS
  • KMOD_LCTRL, KMOD_RCTRL, KMOD_CTRL
  • KMOD_LALT, KMOD_RALT, KMOD_ALT
  • KMOD_LMETA, KMOD_RMETA, KMOD_META
  • KMOD_NUM
  • KMOD_MODE

Powyższe wymagają przedrostka pygame. (co preferuje) lub wymaga importu from pygame.locals import * (czego nie preferuje)


Źródło: Pygame documentation - key (dokumentacja wraz z komentarzami)

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury