Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use time.sleep in pygame?

So i am trying to display an image, wait 1 second and then display another image. I'm making a matching game, so in my code I'm trying to say that if two images don't match, I want to change the image to just a preset generic one. So my code for that would look something like this:

if True:
    self.content = self.image
    time.sleep(1)
    self.content = Tile.cover

self.content is a variable for what is being displayed, self.image is the image that displays, and then Tile.cover is the generic image that covers the other one. Yet whenever I do this the code skips the first line, and just sets the image to Tile.cover, why?

like image 390
Rosina Miller Avatar asked Nov 26 '15 07:11

Rosina Miller


1 Answers

Updated on 18/03/2019.

In Pygame, you have to use pygame.time.wait() instead of python's time.sleep().

It takes time in milliseconds:

pygame.time.wait(1000)

The reason for not using time.sleep is because it will block pygame's event loop and so pygame will not be able to process other events.




Old answer

Following is the older version of this answer which was marked accepted. It is outdated and, most probably, incorrect.

The behaviour which you're getting is due to the way time.sleep()

Example:

I want you to try the following code in your console:

>>> import time
>>> 
>>> def foo():
        print "before sleep"
        time.sleep(1)
        print "after sleep"
>>> 
>>> # Now call foo()
>>> foo()

Did you observe what happened during the output?

>>> # Output on calling foo()
... # Pause for 1 second
... 'before sleep'
... 'after sleep'

This is what is happening with your code too. First it sleeps, then it updates self.content to self.image and Time.cover at the same time.

Fix:

To fix the code in the example above, you can use sys.stdout.flush().

>>> def foo():
        print "before sleep"
        sys.stdout.flush()
        time.sleep(1)
        sys.stdout.flush()
        print "after sleep"

>>> foo()
... 'before sleep'
... # pause for 1 second
... 'after sleep'

Disclaimer:

I haven't tried sys.stdout.flush() with Pygame so I can't say if it will work for you, but you can try.

There seems to be a working solution on this SO question: How to wait some time in pygame?

like image 99
xyres Avatar answered Oct 02 '22 05:10

xyres