5.14: Checking for a Specific Event, and Posting Events to Pygame’s Event Queue
- Page ID
def checkForQuit(): for event in pygame.event.get(QUIT): # get all the QUIT events terminate() # terminate if any QUIT events are present for event in pygame.event.get(KEYUP): # get all the KEYUP events if event.key == K_ESCAPE: terminate() # terminate if the KEYUP event was for the Esc key pygame.event.post(event) # put the other KEYUP event objects back
checkForQuit() function will check for
QUIT events (or if the user has pressed the Esc key) and then call the
terminate() function. But this is a bit tricky and requires some explanation.
Pygame internally has its own list data structure that it creates and appends Event objects to as they are made. This data structure is called the event queue. When the
pygame.event.get() function is called with no parameters, the entire list is returned. However, you can pass a constant like
pygame.event.get() so that it will only return the
QUIT events (if any) that are in the internal event queue. The rest of the events will stay in the event queue for the next time
pygame.event.get() is called.
You should note that Pygame’s event queue only stores up to 127 Event objects. If your program does not call
pygame.event.get() frequently enough and the queue fills up, then any new events that happen won’t be added to the event queue.
Line 2  pulls out a list of
QUIT events from Pygame’s event queue and returns them. If there are any
QUIT events in the event queue, the program terminates.
Line 4  pulls out all the
KEYUP events from the event queue and checks if any of them are for the Esc key. If one of the events is, then the program terminates. However, there could be
KEYUP events for keys other than the Esc key. In this case, we need to put the
KEYUP event back into Pygame’s event queue. We can do this with the
pygame.event.post() function, which adds the Event object passed to it to the end of the Pygame event queue. This way, when line 70 calls
pygame.event.get() the non-Esc key
KEYUP events will still be there. Otherwise calls to
checkForQuit() would "consume" all of the
KEYUP events and those events would never be handled.
pygame.event.post() function is also handy if you ever want your program to add Event objects to the Pygame event queue.