Probleme mit dem schließen des Fensters

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

Hallo zusammen,

ich brauch mal wieder eure Hilfe.
Ich versuche mich gerade in PyGame einzuarbeiten, ich hab das Beispiel-Programm "catanimation.py" von http://inventwithpython.com/pygame/chapter2.html probiert.
Das macht es was es sol, nun wollte ich den Code so erweitern, dass ich selber das Bild bewegen kann. Das macht es auch, ABER nun kann ich, wenn ich das Programm in PyCharm ausführe
nicht mehr über den "Schließen-Button" schließen.

Hier mein Code:

Code: Alles auswählen

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 60
pfs_clock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((400, 300), 0 , 32)
pygame.display.set_caption('Animation')

BLACK = (0, 0, 0)
cat_img = pygame.image.load('cat.png')
cat_x = 10
cat_y = 15

while True:
    DISPLAYSURF.fill(BLACK)

    key_events = pygame.event.get()
    for action in key_events:
        if action.type == pygame.KEYDOWN:
            if action.key == pygame.K_LEFT:
                cat_x -= 15
            if action.key == pygame.K_RIGHT:
                cat_x += 15
            if action.key == pygame.K_DOWN:
               cat_y += 15
            if action.key == pygame.K_UP:
                cat_y -= 15

    if cat_x > 280:
        cat_x = 0
    if cat_x < 0:
        cat_x = 280
    if cat_y > 220:
        cat_y = 0
    if cat_y < 0:
        cat_y = 220

    DISPLAYSURF.blit(cat_img, (cat_x, cat_y))

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()
    pfs_clock.tick(FPS)
Könnt Ihr mir sagen wo mein Fehler liegt, bzw. was ich übersehe hab.

Vielen Dank im Voraus.

Grüße JohannesGolf
BlackJack

@JohannesGolf: Ich vermute mal Du kannst immer noch über den schliessen Button das Fenster schliessen, nur nicht zuverlässig, weil es ja auch passieren kann das das `QUIT`-Ereignis von der ersten Schleife (ab Zeile 22) verarbeitet wird — oder eben auch nicht, denn in dem Schleifenkörper ist der Ereignistyp `QUIT` ja gar nicht vorgesehen und wird dementsprechend ignoriert. Aus dem gleichen Grund kann es passieren dass das Programm nicht auf jeden Tastendruck reagiert, weil die im Gegenzug im zweiten Schleifenkörper über Ereignisse (ab Zeile 43) nicht berücksichtigt werden.

In der ersten Schleife ist dementsprechend die Laufvariable falsch benannt, denn dieser Wert enthält eben nicht nur Tastenereignisse sondern kann alle Ereignisse enthalten die PyGame so kennt.

Üblicherweise hat man nur *eine* Schleife die sich um die Ereignisse kümmert, dann kann so etwas nicht passieren.
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

Das merkwürdige is eher, dann wenn ich den Code aus dem Beispiel nehmen, kann ich das Fenster normal schließen.
Nur wenn ich meine Erweiterung reintue dann geht es nicht mehr.
BlackJack

@JohannesGolf: Das ist überhaupt nicht merkwürdig denn im Beispiel aus dem Buch sind keine *zwei* Schleifen über die Ereignisse, so dass das von mir beschriebene Problem natürlich dort nicht auftauchen kann.
JohannesGolf
User
Beiträge: 34
Registriert: Montag 10. März 2014, 09:27

Problem gelöst.

Hab den Code etwas umgestellt.

Code: Alles auswählen

import pygame, sys
from pygame.locals import *

pygame.init()

FPS = 60
pfs_clock = pygame.time.Clock()

DISPLAYSURF = pygame.display.set_mode((400, 300), 0 , 32)
pygame.display.set_caption('Animation')

BLACK = (0, 0, 0)
cat_img = pygame.image.load('cat.png')
cat_x = 10
cat_y = 15

while True:
    DISPLAYSURF.fill(BLACK)

    events = pygame.event.get()
    for event in events:
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                cat_x -= 15
            if event.key == pygame.K_RIGHT:
                cat_x += 15
            if event.key == pygame.K_DOWN:
               cat_y += 15
            if event.key == pygame.K_UP:
                cat_y -= 15

    if cat_x > 280:
        cat_x = 0
    if cat_x < 0:
        cat_x = 280
    if cat_y > 220:
        cat_y = 0
    if cat_y < 0:
        cat_y = 220

    DISPLAYSURF.blit(cat_img, (cat_x, cat_y))

    pygame.display.update()
    pfs_clock.tick(FPS)
BlackJack

@JohannesGolf: Du könntest mal über den Unterschied zwischen ``if`` und ``elif`` nachdenken und überlegen wo man das ersetzen kann.
Antworten