Zastanawiam się, jak mógłbym stworzyć jeden z tych sprytnych liczników konsoli w Pythonie, jak w niektórych programach C / C ++.
Mam pętlę wykonującą różne czynności, a bieżące dane wyjściowe są następujące:
Doing thing 0
Doing thing 1
Doing thing 2
...
co byłoby ładniejsze, to po prostu zaktualizować ostatnią linię;
X things done.
Widziałem to w wielu programach konsolowych i zastanawiam się, czy / jak bym to zrobił w Pythonie.
print
: stackoverflow.com/a/8436827/1959808curses
to przesada (zobacz zaakceptowaną odpowiedź).Odpowiedzi:
Łatwym rozwiązaniem jest po prostu wpisanie go
"\r"
przed łańcuchem bez dodawania nowej linii; jeśli sznurek nigdy się nie skróci, to wystarczy ...Nieco bardziej wyrafinowany jest pasek postępu ... to jest coś, czego używam:
Wołasz
startProgress
przekazanie opisu operacji, a następnieprogress(x)
gdziex
jest procent i na końcuendProgress()
źródło
restic
,flatpak
) mogą aktualizować kilka wierszy danych wyjściowych konsoli. Czy przypadkiem wiesz, jak można to osiągnąć?Bardziej eleganckim rozwiązaniem mogłoby być:
wywołaj tę funkcję z
value
iendvalue
, wynik powinien byćUwaga: Python 2.x wersja tutaj .
źródło
W Pythonie 3 możesz to zrobić, aby drukować w tej samej linii:
print('', end='\r')
Szczególnie przydatne do śledzenia najnowszych aktualizacji i postępów.
Poleciłbym również tqdm stąd, jeśli ktoś chce zobaczyć postęp pętli. Wyświetla bieżącą iterację i całkowitą liczbę iteracji jako pasek postępu z oczekiwanym czasem zakończenia. Super przydatne i szybkie. Działa dla python2 i python3.
źródło
Inna odpowiedź może być lepsza, ale oto, co robiłem. Najpierw utworzyłem funkcję o nazwie progress, która wypisuje znak backspace:
Następnie nazwałem to w pętli w mojej głównej funkcji w następujący sposób:
Spowoduje to oczywiście wymazanie całej linii, ale możesz z nią zepsuć, aby zrobić dokładnie to, co chcesz. Skończyło się na utworzeniu paska postępu za pomocą tej metody.
źródło
Dla każdego, kto natknie się na to lata później (tak jak ja), poprawiłem trochę metody 6502, aby pasek postępu mógł się zmniejszać, a także zwiększać. Przydatne w nieco większej liczbie przypadków. Dzięki 6502 za świetne narzędzie!
Zasadniczo jedyną różnicą jest to, że cały wiersz #s i -s jest zapisywany za każdym razem, gdy wywoływana jest funkcja progress (x), a kursor jest zawsze zwracany na początek słupka.
źródło
Jeśli dobrze zrozumiałem (nie jestem pewien), chcesz drukować używając,
<CR>
a nie<LR>
?Jeśli tak, jest to możliwe, o ile terminal konsoli na to pozwala (zepsuje się, gdy wyjście si zostanie przekierowane do pliku).
źródło
Można to zrobić bez korzystania z biblioteki sys, jeśli spojrzymy na
print()
funkcjęOto mój kod:
źródło
Napisałem to jakiś czas temu i bardzo się z tego cieszę. Zapraszam do korzystania z niego.
Zajmuje
index
itotal
i opcjonalnietitle
lubbar_length
. Po zakończeniu zastępuje klepsydrę znaczkiem wyboru.⏳ Calculating: [████░░░░░░░░░░░░░░░░░░░░░] 18.0% done
✅ Calculating: [█████████████████████████] 100.0% done
Dołączyłem przykład, który można uruchomić, aby go przetestować.
Mam również wersję z responsywnym paskiem postępu w zależności od szerokości terminala używanego,
shutil.get_terminal_size()
jeśli jest to interesujące.źródło
Dodano trochę więcej funkcjonalności do przykładu Aravind Voggu :
Teraz możesz generować wiele pasków postępu bez zastępowania poprzedniego.
Dodałem również
name
jako wartość o stałej szerokości.źródło
Poniższy kod będzie liczyć wiadomość od 0 do 137 co 0,3 sekundy zastępując poprzednią liczbę.
Liczba symboli za kulisami = liczba cyfr.
źródło