2016-06-29 10 views
1

Ich kann nicht trainieren, um die Schaltfläche Funktion einmal ausgeführt, wenn Sie darauf klicken. Wenn die Maustaste gedrückt ist, wird die Funktionsschleife durchlaufen, bis sie freigegeben wird. Ich möchte nur einmal pro Klick durch die Schleife laufen. Hier ist der Code:Making Button-Funktion einmal ausgeführt

def Button(msg, x, y, w, h, ic, ac, action=None): 
    mouse = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if x+w > mouse[0] > x and y+h > mouse[1] > y: 
     pygame.draw.rect(window, ac, (x, y, w, h)) 
     #if event.type == pygame.MOUSEBUTTONDOWN: 
     if click[0] == 1 and action != None: 
      pygame.draw.rect(window, lightgrey, (x, y, w, h)) 
      if action == "undo": 
       print("hey") 
      if action == "reset": 
       for row in range(6): 
        for column in range(7): 
         board[row][column] = 0   
      elif action == "quit": 
       pygame.quit() 
       quit() 


    else: 
     pygame.draw.rect(window, ic, (x, y, w, h)) 

print („hey“) druckt etwa 3 Mal, wenn Sie so schnell klicken, wie Sie können, wie es durch die Schleife wiederholt ausgeführt wird.

+0

Mögliche Duplikate von [Wie bekomme ich pygame Knopf um nur einen Klick zu registrieren?] (Http://stackoverflow.com/questions/31300690/how-to-get-pygame-button-to-register -only-one-click) – numbermaniac

Antwort

0

pygame.mouse.get_pressed() wird True zurückgeben, solange die Maus gedrückt gehalten wird. Angenommen, dies überprüft jeden Frame, wird 1 oder True für mehrere Frames zurückgegeben, was dazu führt, dass Ihre Druckanweisung mehrmals auftritt.

if event.type == pygame.MOUSEBUTTONDOWN:

Diese Linie, die Sie auf Kommentar ist, die Sie verwenden sollten. Es wird nur aktiviert, wenn die Maus tatsächlich geklickt wird, aber nicht , während gedrückt gehalten wird. Beachten Sie, dass dafür eine Schleife wie for event in pygame.event.get() vor dieser Zeile erforderlich ist.

Also was Sie grundsätzlich tun müssen, ist click = pygame.mouse.get_pressed() zu entfernen und if click[0] == 1 mit der Zeile zu ersetzen, die Sie auskommentiert haben. Hoffentlich funktioniert das :)

+0

Ich habe hinzugefügt, was Sie gesagt haben, und es funktioniert teilweise. Es wird zwar einmal gedruckt, wenn Sie darauf klicken, aber wenn ich erneut auf die Schaltfläche klicke, wird die Schleife nicht durchlaufen. Bedeutet, wenn ich einmal klicke, würde es "hey" drucken, aber wenn ich es noch einmal klicken sollte, druckt nichts –

+0

Das ist eigenartig. Hast du die for-Schleife gelegt wie gesagt? Wenn du es getan hast, wo hast du es hingestellt? – numbermaniac