2017-03-19 3 views
0

Ich habe einen Menübildschirm gemacht, wo das Klicken auf eine Schaltfläche zu einem anderen Bildschirm im selben Fenster führt.Pygame - "Fehler: Anzeige Oberfläche quit"

def main(): 
    import pygame, random, time 
    pygame.init() 

    size=[800, 600] 
    screen=pygame.display.set_mode(size) 
    pygame.display.set_caption("Game") 
    done=False 
    clock=pygame.time.Clock() 

    while done==False: 
     for event in pygame.event.get(): 
      pos = pygame.mouse.get_pos() 
      if event.type == pygame.QUIT: 
       done=True 
       break 
      if button_VIEW.collidepoint(pos): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        print("VIEW.") 
        view() 
        break 

     screen.fill(black) 
      ... 

def view(): 
    done=False 
    clock=pygame.time.Clock() 

    while done==False: 
     for event in pygame.event.get(): 
      pos = pygame.mouse.get_pos() 
      if event.type == pygame.QUIT: 
       done=True 
       break 
      ... 

Wenn möglich, würde Ich mag wissen, wie ich den Fehler vermeiden kann:

screen.fill(black) 
error: display Surface quit 
>>> 

Nach dem Einschalten hier bei anderen Fragen suchen, habe ich versucht, das Hinzufügen break s zu den Ausgängen aller Schleifen, aber immer noch tritt der Fehler auf.

Ich verstehe das Problem ist, dass das Programm versucht, screen.fill(black) auszuführen, nachdem das Fenster geschlossen wurde, aber ich habe keine weiteren Ideen, wie Sie den Fehler verhindern können.

Ich schätze jede Hilfe. Entschuldigung, wenn es einfach scheint.

+1

Bitte post ein [minimale, vollständige und überprüfbare Beispiel] (http://StackOverflow.com/Help/mcve), die immer noch den Fehler und auch die vollständige Traceback (Fehlermeldung) erzeugt. – skrx

+0

@skrx entschuldigt. Ich verstehe, dass ich vielleicht den Code ein wenig mehr kondensiert haben könnte, aber der Code oben ist bereits ziemlich vom Original heruntergeschnitten. – BaconStereo

+0

Das Problem ist, dass wir das Programm nicht ausführen können und auch nicht sehen können, wo der eigentliche Fehler auftritt. – skrx

Antwort

1

mehr Möglichkeiten:

  • Ende des Prozess (beispielsweise mit sys.exit()) in der view Funktion. Nicht ideal.
  • einen Wert aus der view Funktion zurückgeben, um anzuzeigen, dass die Anwendung (z.B. return done) enden shoud, und prüfen, ob diesen Rückgabewert in der main Funktion (if done: return). Besser.
  • make done global und überprüfen Sie den Wert in der main Funktion. Ich würde diese Lösung wirklich nicht mögen.
  • mein Favorit: vermeiden Sie mehrere Ereignis-Schleifen insgesamt, so löst sich das Problem selbst (so könnten Sie nur die main Funktion mit Rückkehr beenden).
+0

Danke für die Hilfe! Aber ich bin mir nicht sicher, ob ich deinen letzten Vorschlag verstehe. meinst du, ich sollte einfach den Prozess in 'def view()' innerhalb der Einrückung von 'if event.type == pygame.MOUSEBUTTONDOWN: '? – BaconStereo

+0

@ BaconStereo der letzte Punkt ist der beste Vorschlag. Ich würde empfehlen, [eine Zustandsmaschine wie diese] (https://www.reddit.com/r/pygame/comments/3kghhj/simple_state_machine_example/) von iminurnamez zu verwenden. Dadurch können Sie zwischen verschiedenen Szenen/Zuständen wechseln und Sie benötigen nur ein Ereignis und eine While-Schleife in der Klasse "Game" (Szenenmanager), die die Ereignisse an die momentan aktive Szene weitergibt. – skrx

+0

@BaconStereo Hier finden Sie ein Beispiel [hier] (http://Stackoverflow.com/a/14727074/142637) – sloth