1

Alright, I want to know how to delay a portion of a program without pausing the entire program. I'm not necessarily good at python so if you could give me a relatively simple answer if possible, that would be great.

I want to have a turtle draw a circle on screen every time this function is called, this is what I have:

import time
from random import randint
turtle5 = turtle.Turtle()    

coinx = randint(-200, 200)
coiny = randint(-200, 200)

turtle5.pu()
turtle5.goto(coinx, coiny)
turtle5.pd()
turtle5.begin_fill()
turtle5.fillcolor("Gold")
turtle5.circle(5, 360, 8)
turtle5.end_fill()
time.sleep(1)
turtle5.clear()
unor
  • 92,415
  • 26
  • 211
  • 360
Michael Leonard
  • 240
  • 1
  • 3
  • 8

2 Answers2

2

There is turtle.ontimer() that calls a function with the specified delay:

turtle.ontimer(your_function, delay_in_milliseconds)
jfs
  • 399,953
  • 195
  • 994
  • 1,670
1

You need to put the part of the program you want to delay in its own thread, and then call sleep() in that thread.

I am not sure exactly what you are trying to do in your example, so here is a simple example:

import time
import threading

def print_time(msg):
    print 'The time %s is: %s.' % (msg, time.ctime(time.time()))

class Wait(threading.Thread):
    def __init__(self, seconds):
        super(Wait, self).__init__()
        self.seconds = seconds
    def run(self):
        time.sleep(self.seconds)
        print_time('after waiting %d seconds' % self.seconds)

if __name__ == '__main__':
    wait_thread = Wait(5)
    wait_thread.start()
    print_time('now')

Output:

The time now is: Mon Jan 12 01:57:59 2015.
The time after waiting 5 seconds is: Mon Jan 12 01:58:04 2015.

Notice that we started the thread that will wait 5 seconds first, but it did not block the print_time('now') call, rather it waited in the background.

EDIT:

From J.F. Sebastian's comment, the simpler solution with threading is:

import time
import threading

def print_time(msg):
    print 'The time %s is: %s.' % (msg, time.ctime(time.time()))

if __name__ == '__main__':
    t = threading.Timer(5, print_time, args = ['after 5 seconds'])
    t.start()
    print_time('now')
Imran
  • 12,950
  • 8
  • 64
  • 79
  • 1
    You don't need a custom thread subclass here. There is `threading.Timer`. You could avoid creating threads in a GUI (like `turtle`), networking code. See [Postponing functions in python](http://stackoverflow.com/a/14040516/4279) – jfs Jan 12 '15 at 07:11