Seite 1 von 1

Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 08:45
von JohannesGolf
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

Re: Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 09:28
von 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.

Re: Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 09:41
von JohannesGolf
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.

Re: Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 10:07
von 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.

Re: Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 10:52
von JohannesGolf
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)

Re: Probleme mit dem schließen des Fensters

Verfasst: Dienstag 23. Juni 2015, 10:57
von BlackJack
@JohannesGolf: Du könntest mal über den Unterschied zwischen ``if`` und ``elif`` nachdenken und überlegen wo man das ersetzen kann.