PyGame Display lässt sich nicht schließen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hallo,
wenn ich mit PyGame ein Display öffne, dass sich mit Escape wieder schließen lassen soll, geht das ned.
Hier gleich ma der Code:

Code: Alles auswählen

import pygame

#Überprüfen, ob die optionalen Text- und Soundmodule geladen werden können
if not pygame.font: print("Fehler pygame.font Modul konnte nicht geladen werden!")
if not pygame.mixer: print("Fehler pygame.mixer Modul konnte nicht geladen werden")

def main():
    # Initialisieren aller PyGame-Module und
    #Fenster erstellen (wir bekommen eine Surface, die den Bildschirm repräsentiert)
    pygame.init()
    screen = pygame.display.set_mode((800, 600))

    #Titel des Fensters setzen, Mauszeiger nicht verstecken und Tastendrücke wiederholt senden+
    pygame.display.set_caption("Pygame-Tutorial: Grundlagen")
    pygame.mouse.set_visible(1)
    pygame.key.set_repeat(1, 30)

    #Clock-Objekt erstellen, das wir benötigen, um die Framerate zu begrenzen
    clock = pygame.time.Clock()

    #Die Schleife, und damit unser Spiel, läuft solange running == True
    running = True
    while running:
        #Framerate auf 30 Fps beschränken
        #PyGame wartet, falls das Programm schneller läuft
        clock.tick(30)

        #screen-Surface mit Schwarz (RGB = 0, 0, 0) füllen
        screen.fill((0, 0, 0))

        #Alle aufgelaufenen Events holen und abarbeiten.
        for event in pygame.event.get():
            #Spiel beenden, wenn wir ein QUIT-Event finden
            if event.type == pygame.QUIT:
                running == False

            #Wir interessierrn uns auch für die "Taste gedrückt"-Events
            if event.type == pygame.KEYDOWN:
                #Wenn Escape edrückt wird, posten wir ein Quit Event in Pygames event-Wartschlange
                if event.type == pygame.K_ESCAPE:
                    pygame.event.post(pygame.event.Event(pygame.QUIT))

        # Inhalt von screen anzeigen
        pygame.display.flip()


# Überprüfen, ob dieses Modul als Progtramm läuft und nicht in einem anderen Modul importiert wird.
if __name__ == "__main__":
    #Unserer Funktion aufrufen
    main()
        

    

Also, bei Starten öffnet sich ein Schwarzes Fenster. Nach ein-zwei Sekunden erscheint oben der Titel. Wenn ich jetzt escape drücke, fängt meine Maus auf dem Display zu flackern an, mehr aber auch nicht. selbes Problem wenn ich auf das X drücke...
Jemand ne Lösung parat?

Ps: Der COde ist aus einem PyGame Tutorial übernommen worden.

PPS: liegt es vllt daran, dass mein raspberrypi nicht stark genug ist?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

wann wird die `while`-Schleife denn verlassen, sodass das Programm enden kann?
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Also, wenn ich Escape drücke wird an Pygame ein Quitevent gesendet, welches dann running auf False setzt und so die Schleife beendet.


EDIT: Habe gerade gesehen, dass sich bei running = False ein zweites = eingeschlichen hat, ändert aber nichts, Problem besteht weiterhin.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Nö, da wird nie ein Quit-Event gesendet weil der Code dafür nie erreicht werden kann, weil ``if event.type == pygame.K_ESCAPE:`` *nie* wahr ist. Der Vergleich ist offensichtlich falsch. Das wäre *immer* wahr wenn `pygame.KEYDOWN == pygame.K_ESCAPE` gelten würde. :-)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Und wieso genau ist es "nie" wahr? Es wäre doch wahr, wenn der Button "Escape" gedrückt wird...?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Phobit: nein, denn ›event.type‹ kann nicht gleichzeitig den Wert ›pygame.KEYDOWN‹ und den Wert ›pygame.K_ESCAPE‹ haben.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Ok, könntest du mir dan einen COdefetzen/Ansatz schicken, wie das alternativ gehen würde? Mein Tutorial hilft da offensichtlich eher ned weiter ^^
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

Beim Programmieren kommt es auf die Details an. Auch jemand der keine Ahnung von pygame hat, sieht, dass wenn eine Variable zwei verschiedene Werte haben soll, etwas falsch ist. Will man den Fehler beheben, muß man die Dokumentation zum Event-Objekt von pygame lesen.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

hier eine Pygame Loop die ich für kleine Grafikspielchen verwende
kannste für deine Zwecke anpassen

Code: Alles auswählen

def run():
	# pygame.key.set_repeat(10)

	pause = False
	run_loop = True

	while run_loop:
		for event in pygame.event.get():
			if event.type == MOUSEMOTION:
				# self.mouse_pos = pygame.mouse.get_pos()
				# moving the mouse over the screen
				# results in about 10% less fps
				continue
			if event.type == QUIT:
				run_loop = False
				pause = True
				break
			if event.type == KEYDOWN:
				# self.key = event.key
				if event.key == K_ESCAPE:
					run_loop = False
					pause = True
					break
				if event.key == K_p:
					pause = not pause   # pause the action
				if event.key == K_b:
					pygame.image.save(self.screen, "screen.png")
				# if event.key == K_UP or event.key == K_w:
				#     pass
				# if event.key == K_DOWN or event.key == K_s:
				#     pass
				# if event.key == K_LEFT or event.key == K_a:
				#     pass
				# if event.key == K_RIGHT or event.key == K_d:
				#     pass
				# if event.key == K_f:
				#     pass
				# if event.key == K_g:
				#     pass
				# if event.key == K_n:
				#     pass
				# if event.key == K_o:
				#     pass
				# if event.key == K_c:
				#     pass
				# if event.key == K_SPACE:
				#     pass

			# elif event.type == pygame.KEYUP:
			#     pass
			#
			# elif event.type == MOUSEBUTTONDOWN:
			# if event.button == 1:   # left mouse button
			#     pass
			# if event.button == 2:   # middle mouse button
			#     pass
			# if event.button == 3:  # right mouse button
			#     pass
			# if event.button == 4:  # mouse scroll up
			#     pass
			# if event.button == 5:  # mouse scroll down
			#     pass

			# elif event.type == MOUSEBUTTONUP:
			#     if event.button == 1:   # left mouse button
			#         pass
			#     if event.button == 2:   # middle mouse button
			#         pass
			#     if event.button == 3:  # right mouse button
			#         pass
			#     if event.button == 4:  # mouse scroll up
			#         pass
			#     if event.button == 5:  # mouse scroll down
			#         pass

		# self.mouse_pos = pygame.mouse.get_pos()

		# if pygame.key.get_mods() & KMOD_SHIFT and pygame.mouse.get_pressed()[0]:
		#     # shift key and left mouse button is pressed simultaneously
		#     pass

		if not pause:
			# do_something()
			pygame.display.update()

		# self.clock.tick(x)  # limit to (x) frames per second

Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Isajah
User
Beiträge: 6
Registriert: Donnerstag 25. Oktober 2018, 22:41

Hi, ich will ja nicht kalten Kaffee aufwärmen, aber da ich gerade das selbe Problem hatte:

An dem Tutorial Script funktioniert alles, das kopiere ich mir auch immer erstmal für ein neues Projekt.

Wenn man das Script aus Idle heraus startet, schließt das Fenster erstmal nicht, aber das Script wird anscheinend gestoppt, wenn man als Hinergrundfarbe eine andere als schwarz wählt kann man das beobachten, wenn ein anderen Fenster drüber liegt. man muss dann jedesmal die Shell neustarten...

Wenn man das selbe Script über die Konsole mit

Code: Alles auswählen

python3 MeinScript.py

aufruft, lässt es sich ohne weiteres schließen.
cool_brick24
User
Beiträge: 34
Registriert: Montag 10. September 2018, 12:45

Deine Frage? Ist diese warscheinlich: Wieso schließt sich die Shell nicht? Antwort: das ist in Python so gedacht. Ich denke, dass es in Python vorgesehen ist, nicht mit der Editor Shell als Spiel/Programm laufen zu lassen, sondern ein doppelklick zu machen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

GUIs koennen bei der simplen Interpreter-Integration in IDLE nicht immer zuverlaessig funktionieren. Das liegt daran, dass IDLE den gleichen Interpreter benutzt, der seine eigene GUI darstellt, und dann startet man damit ein anderes Programm. Das kommt sich in die Quere.

Besser ist es, die Programme ausserhalb durch die Shell zu starten. Und was da funktioniert oder nicht ist dann auch massgeblich. Alternativ benutze einen andere IDE, die einen eigenen, frischen Interpreter fuer die Programmausfuehrung startet.
Antworten