Programm stürzt ab (Pygame)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Daniel Schreiber
User
Beiträge: 21
Registriert: Sonntag 14. Januar 2018, 15:03

Hallo, ich arbeite an einem kleinen Programm, bei welchem man ein Muster gezeigt bekommt und dieses nachzeichnen soll. Ich komme gut voran und das Prinzip funktioniert. Als ich gerade dabei war, meinen Code zu überarbeiten, weil er zu unübersichtlich geworden ist, ist es plötzlich passiert, dass das Programm abstürtzt, sobald ich die Game Klasse aufrufe, im Startscreen funktioniert noch alles einwandfrei. Das komische ist allerdings, dass keine Fehlermeldung angezeigt wird, sondern Pygame keine Rückmeldung mehr gibt. Ich konnte den Fehlerbereich schon auf die Gameloop Funktion einschränken, aber mehr auch nicht. Ihr bracuth jetzt nicht den ganzen Code verstehen, sondern nur herausfinden, warum pygame abstürzt. Kann mir jemand helfen? Das ausführbare bzw nicht ausführbare Programm findet ihr unter https://www.file-upload.net/gal-259073/ogeyns/1.html. Vielen lieben Dank für jegliche Hilfe!

Code: Alles auswählen

def gameloop(self):
        while self.playing:
            self.input()
            self.update()
            self.draw()

    def input(self):
        if pygame.mouse.get_pressed()[0]:
            self.mouseDown = True
            for dot in self.all_dots:
                if not dot.connected and pygame.sprite.collide_circle(self.mouse, dot):
                    if self.startDot is None:
                        self.startDot = dot
                        self.currentDot = dot
                    else:
                        self.lines_list.append((self.currentDot.rect.center, dot.rect.center))
                        dot.connected = True
                        self.currentDot = dot

        else:
            if self.mouseDown:
                self.check()

        if pygame.mouse.get_pressed()[1]:
            self.playing = False
            pygame.quit()

    def update(self):
        self.mouse.update_sprite()
        self.all_dots.update()

    def draw(self):
        screen.fill(lightBlue)
        self.all_dots.draw(screen)
        if self.mouseDown and self.startDot is not None:
            pygame.draw.line(screen, white, self.currentDot.rect.center, self.mouse.rect.center, 10)

        for line in self.lines_list:
            pygame.draw.line(screen, white, line[0], line[1], 10)

        self.all_sprites.draw(screen)
        pygame.display.flip()

    def check(self):
        if self.currentDot is self.startDot:
            if self.startDot is not None:
                self.startDot.connected = False
                self.startDot = None
        elif self.pattern.lines_list == self.lines_list:
            self.playing = False
        else:
            pygame.quit()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Daniel Schreiber: Ich würde von der klassischen Variante mit einer ereignisverarbeitenden Schleife nicht abweichen. Die fehlt Dir hier und darum werden keine Ereignisse mehr vom darunterliegenden System erfasst. Du musst also mindestens regelmässig dafür sorgen, dass das passiert. Ausserdem besteht bei Deinem Ansatz die Gefahr das Du Änderungen bei den Mausbuttons verpasst, weil das ja bei Dir wirklich immer nur eine Momentaufnahme des aktuellen Zustands ist, während bei einer Schleife die alle Ereignisse verarbeitet wirklich jede Zustandsänderung erfasst wird, auch wenn mehrere davon zwischen den Abfragen liegen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Daniel Schreiber
User
Beiträge: 21
Registriert: Sonntag 14. Januar 2018, 15:03

Ja darüber habe ich nachgedacht, aber mich dafür entschieden, weil das Programm so aufgebaut ist, dass der Spieler praktisch die ganze Zeit am Stück die Maus gedrückt hält, weshalb es nicht dazu kommen kann, das kurze ereignisse nicht erfasst werden. Hasst du einen Verdacht, warum das Programm abstürzt?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heisst denn "abstuerzt"? Hast du einen Stacktrace?

Und die Bemerkungen von Blackjack greifen trotzdem. Du verstehst offensichtlich nicht, was da wirklich passiert, und dadurch, dass du die Ereignischleifen nicht laufen laesst, kann es zu Problemen kommen. pygame und das darunter liegende OS gehen davon aus, dass das passiert. Wenn du das nicht beruecksichtigst, dann kann es zB passieren, dass unter Windows dein Programm als nicht-antwortend markiert wird, und der Benutzer eine Fehlermeldung bekommt.
Daniel Schreiber
User
Beiträge: 21
Registriert: Sonntag 14. Januar 2018, 15:03

Hallo, ich habe jetzt mit der klassischen event schleife gearbeitet und es funktioniert wieder. Was ich mich frage, ist warum es auf die andere Weise trotzdem lange zeit funktioniert hat und ob die Queue regelmäßig geleert werden muss?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das die Queue regelmaessig geleert werden muss haben dir jetzt zwei Leute erzaehlt. Und du hast es gemacht, und es laeuft besser. Was koennte dann wohl die Antwort auf die Frage "muss die Queue regelmaessig geleert werden?" sein?

Warum das lange funktioniert hat und jetzt nicht kann dir hier keiner sagen. Wir waren nicht dabei ;)
Daniel Schreiber
User
Beiträge: 21
Registriert: Sonntag 14. Januar 2018, 15:03

Vielen Dank
Daniel Schreiber
User
Beiträge: 21
Registriert: Sonntag 14. Januar 2018, 15:03

Hast du ansonsten Tipps, wie ich meinen Code effizienter gestalten kann?
Antworten