Pythonを使用して、ターミナルで回転カーソルを印刷する方法はありますか?
端末が\ 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')
使いやすい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)
素敵な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 のように、長い関数呼び出し中にスレッドを使用してスピナーを表示することもできます。
解決策:
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」を使用して標準出力をフラッシュすることです。
もちろん、それは可能です。バックスペース文字(\b
)「カーソル」が回転しているように見える4つの文字の間に(-
、\
、|
、/
)。
curses module。 addstr()およびaddch()関数をご覧ください。しかし、決して使用しませんでした。
素晴らしいprogressbar
モジュールを入手してください- http://code.google.com/p/python-progressbar/ use RotatingMarker
。
より高度なコンソール操作には、Unixでは curses python module を使用できます。Windowsでは、同等の機能を提供する WConio を使用できますcursesライブラリの機能。
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)
明らかな制限がありますが、やはり粗雑です。
#!/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 モジュールを使用することです。バックグラウンドで実行されている実際の処理を使用して、速度をいくらか下げたいと思うでしょう。