web-dev-qa-db-ja.com

回転するコマンドラインカーソルを作成する方法

Pythonを使用して、ターミナルで回転カーソルを印刷する方法はありますか?

56
Nathan

端末が\ 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')
66
nos

使いやすいAPI(これはスピナーを別のスレッドで実行します):

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 __enter__(self):
        self.busy = True
        threading.Thread(target=self.spinner_task).start()

    def __exit__(self, exception, value, tb):
        self.busy = False
        time.sleep(self.delay)
        if exception is not None:
            return False

次に、コード内のwithブロックで使用します。

with Spinner():
  # ... some long-running operations
  # time.sleep(3) 
36

素敵なPythonの方法はitertools.cycleを使用することです:

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

また、 http://www.interclasse.com/scripts/spin.php のように、長い関数呼び出し中にスレッドを使用してスピナーを表示することもできます。

33
Damien

解決策:

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)

重要なのは、バックスペース文字「\ b」を使用して標準出力をフラッシュすることです。

10
Nathan

もちろん、それは可能です。バックスペース文字(\b)「カーソル」が回転しているように見える4つの文字の間に(-\|/)。

curses module。 addstr()およびaddch()関数をご覧ください。しかし、決して使用しませんでした。

1
MattiaG

素晴らしいprogressbarモジュールを入手してください- http://code.google.com/p/python-progressbar/ use RotatingMarker

より高度なコンソール操作には、Unixでは curses python module を使用できます。Windowsでは、同等の機能を提供する WConio を使用できますcursesライブラリの機能。

1
David
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') 

これは、パラメーター付きの関数を使用する別のソリューションにもなります。

0
user3297919

ここに行く-シンプルで明確。

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)
0

粗野だがシンプルなソリューション:

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)

明らかな制限がありますが、やはり粗雑です。

0
mbunch
#!/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で機能しない curses モジュールを使用することです。バックグラウンドで実行されている実際の処理を使用して、速度をいくらか下げたいと思うでしょう。

0
user177800