Как создать вращающийся курсор командной строки с помощью 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)
есть очевидные ограничения, но опять же, сырой.