Как создать вращающийся курсор командной строки с помощью python?

есть ли способ распечатать вращающийся курсор в терминале С помощью Python?

12 ответов


что-то вроде этого, предполагая, что ваш терминал обрабатывает \b

import sys
import time

def spinning_cursor():
    while True:
        for cursor in '|/-\':
            yield cursor

spinner = spinning_cursor()
for _ in range(50):
    sys.stdout.write(next(spinner))
    sys.stdout.flush()
    time.sleep(0.1)
    sys.stdout.write('\b')

хороший питонический способ-использовать itertools.цикл:

import itertools, sys
spinner = itertools.cycle(['-', '/', '|', '\'])
while True:
    sys.stdout.write(spinner.next())  # write the next character
    sys.stdout.flush()                # flush stdout buffer (actual character display)
    sys.stdout.write('\b')            # erase the last written char

кроме того, вы можете использовать threading для отображения счетчика во время длительного вызова функции, как вhttp://www.interclasse.com/scripts/spin.php


простой в использовании API (это будет запускать Run spinner в отдельном потоке):

import sys
import time
import threading

class Spinner:
    busy = False
    delay = 0.1

    @staticmethod
    def spinning_cursor():
        while 1: 
            for cursor in '|/-\': yield cursor

    def __init__(self, delay=None):
        self.spinner_generator = self.spinning_cursor()
        if delay and float(delay): self.delay = delay

    def spinner_task(self):
        while self.busy:
            sys.stdout.write(next(self.spinner_generator))
            sys.stdout.flush()
            time.sleep(self.delay)
            sys.stdout.write('\b')
            sys.stdout.flush()

    def start(self):
        self.busy = True
        threading.Thread(target=self.spinner_task).start()

    def stop(self):
        self.busy = False
        time.sleep(self.delay)

в любом месте кода, где это необходимо:

spinner = Spinner()
spinner.start()
# ... some long-running operations
# time.sleep(3) 
spinner.stop()

решение:

import sys
import time

print "processing...\",
syms = ['\', '|', '/', '-']
bs = '\b'

for _ in range(10):
    for sym in syms:
        sys.stdout.write("\b%s" % sym)
        sys.stdout.flush()
        time.sleep(.5)

ключ должен использовать символ backspace '\b ' и flush stdout.


конечно, это возможно. Это просто вопрос печати символа backspace (\b) между четырьмя символами, которые сделают "курсор" похожим на вращение (-, \, |, /).


модуль проклятий. Я бы посмотрел на функции addstr() и addch (). Но никогда им не пользовался.


для более продвинутых консольных манипуляций в unix вы можете использовать проклинает модуль python, а в windows вы можете использовать WConio который обеспечивает эквивалентную функциональность библиотеки проклятий.


захватить удивительные progressbar модуль http://code.google.com/p/python-progressbar/ использовать RotatingMarker.


#!/usr/bin/env python

import sys

chars = '|/-\'

for i in xrange(1,1000):
    for c in chars:
        sys.stdout.write(c)
        sys.stdout.write('\b')
        sys.stdout.flush()

предостережения: По моему опыту, это работает не во всех терминалах. Более надежный способ сделать это в Unix / Linux, будь то сложнее, - использовать проклятие модуль, который не работает под Windows. Вероятно, вы хотите замедлить его как-то с фактической обработкой, которая происходит в фоновом режиме.


import sys
def DrowWaitCursor(self, counter):
    if counter % 4 == 0:
        print("/",end = "")
    elif counter % 4 == 1:
        print("-",end = "")
    elif counter % 4 == 2:
        print("\",end = "")
    elif counter % 4 == 3:
        print("|",end = "")
    sys.stdout.flush()
    sys.stdout.write('\b') 

Это также может быть другое решение, использующее функцию с параметром.


здесь вы идете-просто и ясно.

import sys
import time

idx = 0
cursor = ['|','/','-','\'] #frames of an animated cursor

while True:
    sys.stdout.write(cursor[idx])
    sys.stdout.write('\b')
    idx = idx + 1

    if idx > 3:
        idx = 0

    time.sleep(.1)

грубое, но простое решение:

import sys
import time
cursor = ['|','/','-','\']
for count in range(0,1000):
  sys.stdout.write('\b{}'.format(cursor[count%4]))
  sys.stdout.flush()
  # replace time.sleep() with some logic
  time.sleep(.1)

есть очевидные ограничения, но опять же, сырой.