Python >> Python tutorial >  >> Python GUI >> Pygame GUI

Hvordan kan jeg registrere, om brugeren har dobbeltklikket i pygame?

Jeg ville bare bruge deltatidsværdien, clock.tick vender tilbage for at øge en timer. I dette eksempel har du 0,5 sekunder til at dobbeltklikke ellers nulstilles timeren.

import sys
import pygame as pg


pg.init()

screen = pg.display.set_mode((640, 480))
BLACK = pg.Color('black')
FONT = pg.font.Font(None, 32)


def game():
    clock = pg.time.Clock()
    timer = 0
    dt = 0
    running = True

    while running:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                running = False
            if event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if timer == 0:  # First mouse click.
                        timer = 0.001  # Start the timer.
                    # Click again before 0.5 seconds to double click.
                    elif timer < 0.5:
                        print('double click')
                        timer = 0

        # Increase timer after mouse was pressed the first time.
        if timer != 0:
            timer += dt
            # Reset after 0.5 seconds.
            if timer >= 0.5:
                print('too late')
                timer = 0

        screen.fill(BLACK)
        txt = FONT.render(str(round(timer, 2)), True, (180, 190, 40))
        screen.blit(txt, (40, 40))
        pg.display.flip()
        # dt == time in seconds since last tick.
        # / 1000 to convert milliseconds to seconds.
        dt = clock.tick(30) / 1000


if __name__ == '__main__':
    game()
    pg.quit()
    sys.exit()

Jeg har aldrig brugt pygame - men:

  • Detektering af dobbeltklik: ved et gæt, i stedet for at behandle hvert klik med det samme, skal du anvende en forsinkelse på 50 ms og se, om du får endnu en klikbegivenhed inden for den tid. Brugeren vil sandsynligvis ikke bemærke forsinkelsen på 50 ms.

  • Skelne mellem rullehjul op/ned: se kommentarerne på denne dokumentationsside. Tilsyneladende er der defineret fem knapper - venstre, midterste, højre, rullehjul op og rullehjul ned. Det vil sige, du kan fange rullehjulsbegivenheder på samme måde, som du fanger venstreklik - du skal bare kigge efter SCROLL_UP eller lignende i stedet for LEFT .

    Slå op i dokumentationen for at finde ud af præcis, hvad SCROLL_UP kaldes.


Indstil en timer, når der trykkes på musen første gang for at placere en brugerbegivenhed i pygame-begivenhedskøen, og indstil en variabel til 1 for at angive et klik. Når det andet klik finder sted, skal du kontrollere variablen og indstille timerhændelsesobjektet til fra. Tjek, om brugerhændelsen kommer op i køen, da det betyder, at timeren har timeout. se dette smukke svar for mere information:Flyt et objekt med få sekunders mellemrum i Pygame

Her er koden. Erstat double_click() opkald med dit eget funktionskald:

def run():

    global clock, double_click_event, timer
    double_click_event = pygame.USEREVENT + 1
    timer = 0

    while True:
        clock.tick(60)
        check_events()
        frame.update()
        screen.blit(frame, (0,0))
        pygame.display.flip()   


def check_events():
    global dispatcher, double_click_event, timer

    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            if timer == 0:
                pygame.time.set_timer(double_click_event, 500)
                timerset = True
            else:
                if timer == 1:
                    pygame.time.set_timer(double_click_event, 0)
                    double_click()
                    timerset =False

            if timerset:
                timer = 1
                return
            else: 
                timer = 0
                return

        elif event.type == double_click_event:
            # timer timed out
            pygame.time.set_timer(double_click_event, 0)
            timer = 0
            print "evt = dble click"