Soru Python kullanarak bir eğirme komut satırı imleci nasıl oluşturulur?


Python kullanarak bir terminalde bir iplik imlecini yazdırmanın bir yolu var mı?


44
2018-02-14 18:17


Menşei


Bu harika bir soru. Kodu bugün kullandım! - Randy


Cevaplar:


Böyle bir şey, terminal tutamaçlarınız varsayarak \ 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')

55
2018-02-14 18:33



Kullanmak isteyebilirsiniz spinner = itertools.cycle(['-', '/', '|', '\\']) gösterildiği gibi bir jeneratör işlevi (daha az ayrıntılı ve daha fazla yeniden) oluşturmak yerine İşte - Damien
Ve bu bash versione;) fitnr.com/showing-a-bash-spinner.html - loretoparisi
Python 3 ile, spinner.next() tarafından değiştirildi next(spinner); görmek stackoverflow.com/a/1073582/5025060. - CODE-REaD


Güzel bir pythonic yolu itertools.cycle kullanmaktır:

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

Ayrıca, uzun bir işlev çağrısı sırasında çeviriciyi görüntülemek için iş parçacığı kullanmak isteyebilirsiniz. http://www.interclasse.com/scripts/spin.php


25
2018-03-24 17:10



CODE-REaD'ın diğer cevaptaki yorumu, python 3'te olduğu gibi, next(spinner) yerine spinner.next() - Siyh


Kolay kullanımlı API (bu, ayrı bir iş parçacığında çalıştırıcıyı çalıştırır):

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)

Gerekli yerlerde kodun herhangi bir yerinde:

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

20
2017-09-15 06:35



Bu, kodunuzda ele alınmayan bir hatayı yakalayana kadar gerçekten güzel. O zaman durmaya zorlayamazsın. - DDuffy


Bir çözüm:

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)

Anahtar, backspace karakterini '\ b' kullanmak ve stdout'u temizlemektir.


9
2018-02-14 18:22





Elbette, mümkün. Bu sadece backspace karakterini yazdırmak meselesi.\b"imleci" döndürecek gibi görünen dört karakter arasında -, \, |, /).


2
2018-02-14 18:21





lanetler modülü. addstr () ve addch () işlevlerine bir göz atabilirim. Bunu hiç kullanmadım.


1
2018-02-14 18:30





Daha gelişmiş konsol manipülasyonları için, unix'te curses python modülüve pencerelerde kullanabilirsiniz WConio hangi lanetli kütüphane eşdeğer işlevsellik sağlar.


1
2018-02-14 18:27





Harika yakala progressbar modül - http://code.google.com/p/python-progressbar/ kullanım RotatingMarker.


1
2018-02-14 19:34





#!/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()

YETERSİZLİKLER: Benim durumumda bu tüm terminallerde işe yaramıyor. Unix / Linux altında bunu yapmak için daha sağlam bir yol, daha karmaşık olması için kullanmak lanetler Windows altında çalışmayan modül. Muhtemelen arka planda devam eden gerçek işlemlerle nasıl yavaşlatmak istersiniz.


0
2018-02-14 18:28





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

Bu, bir parametreli bir işlevi kullanarak başka bir çözüm de olabilir.


0
2018-05-10 15:45