Jey
Jey

Reputation: 2369

Multiple timers in Python (Pygame)

I'm an amateur programmer. I am trying to write a simple program that will measure the reaction time for a series of visual stimuli (flashes of squares) that will be used for a biology experiment. Here's my code (beware, first time coding a graphical interface):

stimulus = pygame.Rect(100,250,100,100)

#draw on surface object
time.sleep(2) #wait for 2 seconds before it appears
screen.fill(BLACK)
pygame.draw.rect(screen,WHITE,stimulus)
pygame.display.update(stimulus)

#record time stimulus appeared
t0 = time.clock()

#clear screen ("flash" illusion)
time.sleep(0.5) #***PROBLEM***
screen.fill(BLACK)
pygame.display.update(stimulus) 


while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            t1 = time.clock()
            print t1-t0
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

The program was working fine before I included the block with the line marked "problem". The reaction time printed seemed reasonable. However, I want the square to disappear after a while, as though it just "flashed". After including the time.sleep(0.5), the time printed is no longer correct. It is always 0.5xxxx or greater, no matter how fast I press. Is there any workaround?

P.S. I need it to disappear because I want to present a sequence of flashes with predetermined (not constant) pauses in between.

Thanks.

Edit

I need to achieve two things: 1. The shape must flash on the screen for 0.5 sec. 2. The program must create a timestamp (e.g. write to a list) every time the spacebar is pressed (even if it is pressed randomly twice between two flashes).

Upvotes: 0

Views: 2592

Answers (2)

ninMonkey
ninMonkey

Reputation: 7501

Use pygame.time.get_ticks() which gives you milliseconds elapsed since pygame.init

edit:

If you save the get_ticks value when the shape is first shown, then every keydown, append to your list the current get_ticks.

for press in press_times:
    print "milliseconds: {}".format(press - time_start)

Milliseconds meaning 500 is equivalent to 0.5 seconds.

Upvotes: 1

ThisIsAQuestion
ThisIsAQuestion

Reputation: 1967

Your problem is that the computer will be doing nothing for 0.5 seconds due to the line you marked as a problem. What you need to do is make it so it is possible for the reaction to be registered while the square is still being shown. Instead of having time.sleep(0.5), put this:

while time.clock()-t0<0.5:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            t1 = time.clock()
            print t1-t0

This should fix your code.

Upvotes: 1

Related Questions