Seite 1 von 1

PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 14:21
von Phobit
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?

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 14:30
von narpfel
Moin,

wann wird die `while`-Schleife denn verlassen, sodass das Programm enden kann?

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 14:35
von Phobit
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.

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 15:07
von __blackjack__
@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. :-)

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 16:25
von Phobit
Und wieso genau ist es "nie" wahr? Es wäre doch wahr, wenn der Button "Escape" gedrückt wird...?

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 16:29
von Sirius3
@Phobit: nein, denn ›event.type‹ kann nicht gleichzeitig den Wert ›pygame.KEYDOWN‹ und den Wert ›pygame.K_ESCAPE‹ haben.

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 16:31
von Phobit
Ok, könntest du mir dan einen COdefetzen/Ansatz schicken, wie das alternativ gehen würde? Mein Tutorial hilft da offensichtlich eher ned weiter ^^

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 16:40
von Sirius3
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.

Re: PyGame Display lässt sich nicht schließen

Verfasst: Samstag 30. Juni 2018, 20:15
von ThomasL
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


Re: PyGame Display lässt sich nicht schließen

Verfasst: Freitag 16. November 2018, 22:19
von Isajah
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.

Re: PyGame Display lässt sich nicht schließen

Verfasst: Montag 19. November 2018, 10:45
von cool_brick24
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.

Re: PyGame Display lässt sich nicht schließen

Verfasst: Montag 19. November 2018, 12:42
von __deets__
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.