Mein Button Funktioniert nicht so wie ich es haben will.

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
N4SONIC
User
Beiträge: 32
Registriert: Sonntag 28. Dezember 2014, 15:46

Hallo,

Ich habe ein Button wenn ich drauf klicke soll die Nachricht "Test" nur einmal erscheinen. Aber bei mir ist es so das wenn ich auf denn Button klicke das die Nachricht "Test" gespamt kommt :/

Was habe ich falsch gemacht ?

Code: Alles auswählen

import pygame

black = (0,0,0)

class Design:
	def __init__(self):
		self.button_1 = pygame.Rect(400,300,100,50)

	def render(self,window):
		pygame.draw.rect(window,black,(self.button_1))

		mouse_click = pygame.mouse.get_pressed()
		mouse_pos = pygame.mouse.get_pos()

		if mouse_click[0] and self.button_1.collidepoint(mouse_pos):
			print("Test")

design = Design()

pygame.init()

window = pygame.display.set_mode((800,600))

pygame.display.set_caption("Window")

clock = pygame.time.Clock()

running = True
while running:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            running = False

    window.fill((255,255,255))

    design.render(window)

    clock.tick(60)
    pygame.display.flip()

pygame.quit()
Sirius3
User
Beiträge: 18332
Registriert: Sonntag 21. Oktober 2012, 17:20

Du fragst ja auch ab, ob die Maustaste gedrückt ist (get_pressed) und das ist sie eben eine ganze Zeit lang, und so lange kommen auch Deine "Test"s.
BlackJack

@N4SONIC: Warum hättest Du denn jetzt gedacht das sich der Code anders verhält? `pygame.mouse.get_pressed()` gibt den aktuellen Zustand der Maustasten wieder, das heisst solange die Maustaste gedrückt ist, ist auch die (Teil)Bedingung wahr, und `render()` rufst Du regelmässig auf. Also wird auch bei jedem Aufruf der Text ausgegeben.

An der Stelle sollte man besser mit den Ereignissen von Pygame arbeiten und nicht die Maustasten (und Position) selber periodisch abfragen.
N4SONIC
User
Beiträge: 32
Registriert: Sonntag 28. Dezember 2014, 15:46

@BlackJack: Danke für die Antwort :) Ich bin ein Anfänger und weiß nicht wie ich das machen soll könntest du ein Example machen ?
BlackJack

@N4SONIC: Du hast doch schon eine Schleife für Ereignisse in der Du auf `QUIT` reagierst. Da gibt es noch einen Haufen anderer Ereignisse, zum Beispiel 'MOUSEBUTTONDOWN' und das Ereignisobjekt hat die Position und die Nummer der betroffenen Maustaste als Attribute. Details siehe: http://www.pygame.org/docs/ref/event.html
N4SONIC
User
Beiträge: 32
Registriert: Sonntag 28. Dezember 2014, 15:46

@BlackJack: Danke du hast mir geholfen es Funktioniert :)

Code: Alles auswählen

running = True
while running:

    for event in pygame.event.get():

        if event.type==pygame.QUIT:

            running = False

        mouse_pos = pygame.mouse.get_pos()

        if event.type == pygame.MOUSEBUTTONDOWN:
        	if design.button_1.collidepoint(mouse_pos):
        		print("Test")

    window.fill((255,255,255))

    design.render(window)

    clock.tick(60)
    pygame.display.flip()

pygame.quit()
BlackJack

@N4SONIC: Wobei das jetzt ein nicht so schöner OOP-Entwurf ist das die Hauptschleife diesen Test macht und so weit in das `Design`-Objekt eingreift.
Antworten