Zoeken…


Evenement lus

Pygame registreert alle gebeurtenissen van de gebruiker in een gebeurteniswachtrij die kan worden ontvangen met de code pygame.event.get() . Elk element in deze wachtrij is een Event object en ze hebben allemaal het attribuut type , dat is een geheel getal dat wat voor soort evenement is. In de pygame-module zijn vooraf gedefinieerde integer-constanten die het type vertegenwoordigen. Behalve dit attribuut hebben evenementen verschillende attributen.

Constante naam attributen
STOPPEN geen
ACTIVEEVENT winst, staat
TOETS NEER unicode, sleutel, mod
keyUp sleutel, mod
MOUSEMOTION pos, rel, knoppen
MOUSEBUTTONUP pos, knop
MouseButtonDown pos, knop
JOYAXISMOTION vreugde, as, waarde
JOYBALLMOTION vreugde, bal, rel
JOYHATMOTION vreugde, hoed, waarde
JOYBUTTONUP vreugde, knop
JOYBUTTONDOWN vreugde, knop
VIDEORESIZE maat, w, h
VIDEOEXPOSE geen
USEREVENT code

Voorbeeld

Om onze evenementen af te handelen, lopen we eenvoudig door de wachtrij, controleren welk type het is (met behulp van de vooraf gedefinieerde constanten in de pygame-module) en voeren vervolgens een actie uit. Deze code controleert of de gebruiker op de knop Sluiten in de bovenhoek van het display heeft gedrukt en beëindigt het programma.

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # Close the program any way you want, or troll users who want to close your program.
        raise SystemExit

LET OP : Je moet de wachtrij voor evenementen regelmatig oproepen wanneer je pygame gebruikt! Afgezien van het ophalen van de beschikbare gebeurtenissen, is het oproepen van de gebeurteniswachtrij ook de manier van pygame om intern met het besturingssysteem te communiceren. Als de gebeurteniswachtrij niet regelmatig wordt aangeroepen, gaat uw besturingssysteem ervan uit dat uw programma niet meer correct werkt en mogelijk eruit ziet alsof het programma is gecrasht (in Windows wordt het venster wit). Als je niets met de evenementen wilt doen, moet je elke pygame.event.pump() aanroepen om ervoor te zorgen dat pygame de gebeurtenissen intern verwerkt.


Toetsenbordgebeurtenissen

Er zijn twee soorten sleutelgebeurtenissen in pygame: KEYDOWN en KEYUP . Deze gebeurtenissen een attribuut key die een geheel getal een toets op het toetsenbord. De pygame-module heeft vooraf gedefinieerde integer-constanten die alle gemeenschappelijke sleutels vertegenwoordigen. De constanten worden genoemd met een hoofdletter K , een onderstrepingsteken en de naam van de sleutel. Bijvoorbeeld: <- heet K_BACKSPACE , a heet K_a en F4 krijgt de naam K_F4 .

Voorbeeld

Deze code controleert of de gebruiker op w , a , s of d heeft gedrukt.

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Usually wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_w:
            print("Player moved up!")
        elif event.key == pygame.K_a:
            print("Player moved left!")
        elif event.key == pygame.K_s:
            print("Player moved down!")
        elif event.key == pygame.K_d:
            print("Player moved right!")

modifiers

Er is geen constant getal voor hoofdletters. In plaats daarvan hebben toetsgebeurtenissen een ander attribuut genaamd mod , dat wil zeggen dat de modificatoren ( shift , ctrl , alt enz.) Tegelijkertijd als de toets worden ingedrukt. Het mod attribuut is een geheel getal dat de modifier weergeeft die wordt ingedrukt. De gehele waarde van elke modificator wordt opgeslagen in de pygame-module onder de naam KMOD_ en hun naam. Links verschuiven heet bijvoorbeeld KMOD_LSHIFT , Tab heeft KMOD_TAB en Ctrl heeft KMOD_CTRL .

Voorbeeld

Deze code controleert of de gebruiker op a , Links shift + a of Caps + a heeft gedrukt.

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # It's still wise to be able to close your program.
        raise SystemExit
    elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_a:
            if event.mod == 0:  # No modifier.
                print("You pressed 'a'")
            elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
                print("You pressed 'A'")
            else:
                print("You pressed 'a' with another modifier than right shift or caps.")

Muis evenementen

Er zijn drie soorten van de muis gebeurtenissen in pygame MOUSEMOTION , MOUSEBUTTONDOWN en MOUSEBUTTONUP . Pygame zal deze gebeurtenissen registreren wanneer een weergavemodus is ingesteld.

MOUSEMOTION wordt ontvangen wanneer de gebruiker zijn of haar muis op het scherm beweegt. Het heeft de attributen buttons , pos en rel .

  • buttons is een tuple die aangeeft of de muisknoppen ( left , mouse-wheel , right ) worden ingedrukt of niet.
  • pos is de absolute positie ( x , y ) van de cursor in pixels.
  • rel is de positie ten opzichte van de vorige positie ( rel_x , rel_y ) in pixels.

MOUSEBUTTONDOWN en MOUSEBUTTONUP worden ontvangen wanneer de gebruiker een muisknop indrukt of loslaat. Ze hebben de attributen button en pos .

  • button is een geheel getal dat de knop aangeeft die wordt ingedrukt. 1 voor linkerknop, 2 voor muiswiel en 3 voor rechterknop.
  • pos is de absolute positie van de muis ( x , y ) wanneer de gebruiker op de muisknop drukte.

Voorbeeld

Hier is een kort voorbeeld met enkele attributen van elke muisgebeurtenis:

for event in pygame.event.get():
    if event.type == pygame.QUIT:  # Close your program if the user wants to quit.
        raise SystemExit
    elif event.type == pygame.MOUSEMOTION:
        if event.rel[0] > 0:  # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
            print("You're moving the mouse to the right")
        elif event.rel[1] > 0:  # pygame start y=0 at the top of the display, so higher y-values are further down.
            print("You're moving the mouse down")
    elif event.type == pygame.MOUSEBUTTONDOWN:
        if event.button == 1:
            print("You pressed the left mouse button")
        elif event.button == 3:
            print("You pressed the right mouse button")
    elif event.type == pygame.MOUSEBUTTONUP:
        print("You released the mouse button")

Aangezien er geen vooraf gedefinieerde constanten zijn voor het kenmerk muisknop in de pygame-module, zijn hier de waarden voor elk:

Knop Waarde
Linkermuisknop 1
Muiswielknop 2
Rechter muis knop 3
Muiswiel naar boven scrollen 4
Muiswiel naar beneden scrollen 5

Door met de muisknop te pygame.MOUSEBUTTONUP gebeurtenissen pygame.MOUSEBUTTONDOWN en pygame.MOUSEBUTTONUP gegenereerd.

Staat controleren

Het is mogelijk om functies vanuit de module pygame.key en pygame.mouse aan te roepen om de status van de sleutel en muis te ontvangen. Het is echter niet de aanbevolen manier om gebeurtenissen in pygame te verwerken, omdat er een aantal fouten mee zijn:

  • U ontvangt de statussen wanneer de functie wordt gebeld, wat betekent dat u mogelijk gebeurtenissen tussen oproepen mist als de gebruiker snel op knoppen drukt.

  • U kunt de volgorde van de gebeurtenissen niet bepalen.

  • Je moet nog steeds een van de pygame-gebeurtenisfuncties aanroepen om pygame intern te laten communiceren met het besturingssysteem, anders zal het waarschuwen dat het programma niet meer reageert. De functies die u kunt oproepen zijn:

    • pygame.event.get() om alle gebeurtenissen of gebeurtenistypen (door de typen als argument door te geven) uit de wachtrij te halen.
    • pygame.event.poll() om één gebeurtenis uit de wachtrij te krijgen.
    • pygame.event.wait() om te wachten op één gebeurtenis uit de wachtrij.
    • pygame.event.clear() om alle gebeurtenissen in de wachtrij te wissen.
    • pygame.event.pump() om toe te staan dat pygame interne acties afhandelt (wordt impliciet aangeroepen door de bovenstaande functies).

Toetsenbordgebeurtenissen

De pygame.key.get_pressed() heeft een functie pygame.key.get_pressed() die een lijst retourneert met de status van alle toetsen. De lijst bevat 0 voor alle toetsen die niet zijn ingedrukt en 1 voor alle toetsen die zijn ingedrukt. De index in de lijst wordt gedefinieerd door constanten in de pygame-module, allemaal voorafgegaan door K_ en de sleutelnaam.

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
    print("You pressed 'a'")
if key[pygame.K_F1]:
    print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
    print("You pressed 'left shift'")
if key[pygame.K_q]:  # Press 'q' to exit the program
    quit()

Als u wilt controleren of er een toets wordt ingedrukt in plaats van dat de toets ingedrukt wordt gehouden, kunt u de vorige status van alle toetsen opslaan in een tijdelijke variabele en controleren of de waarde verandert:

pygame.event.pump()  # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
    print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
    print("You pressed 'p'")
previous_key = key

De instructie wordt alleen als waar geëvalueerd wanneer de huidige toets wordt ingedrukt en de vorige toets niet wordt ingedrukt. Om te controleren of de gebruiker de sleutel heeft vrijgegeven, hoeft u alleen het not trefwoord om te schakelen ( if not key[pygame.K_q] and previous_key[pygame.K_q] ). Om dit goed te laten werken, moet je de variabele previous_key = pygame.key.get_pressed() voor de previous_key = pygame.key.get_pressed() , anders ontvang je een NameError .

Muis evenementen

De muismodule heeft functies waarmee we de positie van de muis kunnen controleren en instellen en de ingedrukte knoppen kunnen controleren. De functie pygame.mouse.get_pressed() retourneert een tuple tuple die pygame.mouse.get_pressed() of de muisknoppen (links, muiswiel, rechts) worden ingedrukt of niet.

pygame.event.pump()  # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
    pygame.mouse.set_pos(10, mouse_pos[1])  # Reset the mouse's x-position to 10.
    print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
    print("I'm right, right?")
if mouse_buttons[0]:  # Press left mouse button to exit.
    print("Program left")
    quit()


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow