import threading
import sys, os
import time
import unicodedata
class SpinCursor(threading.Thread):
""" A console spin cursor class """
def __init__(self, msg='',maxspin=0,minspin=10,speed=5):
# Count of a spin
self.count = 0
self.out = sys.stdout
self.flag = False
self.max = maxspin
self.min = minspin
# Any message to print first ?
self.msg = msg
# Complete printed string
self.string = ''
# Speed is given as number of spins a second
# Use it to calculate spin wait time
self.waittime = 1.0/float(speed*4)
if os.name == 'posix':
self.spinchars = (unicodedata.lookup('FIGURE DASH'),u'\\ ',u'| ',u'/ ')
else:
# The unicode dash character does not show
# up properly in Windows console.
self.spinchars = (u'-',u'\\ ',u'| ',u'/ ')
threading.Thread.__init__(self, None, None, "Spin Thread")
def spin(self):
""" Perform a single spin """
for x in self.spinchars:
self.string = self.msg + "...\t" + x + "\r"
self.out.write(self.string.encode('utf-8'))
self.out.flush()
time.sleep(self.waittime)
def run(self):
while (not self.flag) and ((self.count<self.min) or (self.count<self.max)):
self.spin()
self.count += 1
# Clean up display...
self.out.write(" "*(len(self.string) + 1))
def stop(self):
self.flag = True
if __name__ == "__main__":
spin = SpinCursor(msg="Spinning...",minspin=5,speed=5)
spin.start()