summaryrefslogtreecommitdiff
path: root/PYTHON/PROGRESS BAR.md
blob: d9d054d19d1f8a40c2a451b36fd1add76585af79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 

![](https://habrastorage.org/getpro/habr/post_images/466/0af/83f/4660af83f239a7d8e1f14a02fb8ed13d.gif)
Зачем нужны индикаторы прогресса?

Индикаторы прогресса (progress bar) — визуальное отображение процесса работы. Они избавляют нас от необходимости беспокоиться о том, не завис ли скрипт, дают интуитивное представление о скорости его выполнения и подсказывают, сколько времени осталось до завершения.

Человек ранее не использовавший индикаторы прогресса может предположить, что их внедрение может сильно усложнить код. К счастью, это не так. Небольшие примеры ниже покажут, как быстро и просто начать отслеживать прогресс в консоли или в интерфейсе быстро набирающей популярность графической библиотеки [PySimpleGUI](https://github.com/PySimpleGUI/PySimpleGUI).

# Используем Progress

Первым у нас идёт модуль [Progress](https://github.com/verigak/progress/)_._

Всё, что от вас потребуется, это указать количество ожидаемых итераций, тип индикатора и вызывать функцию при каждой итерации:

```python
import time
from progress.bar import IncrementalBar

mylist = [1,2,3,4,5,6,7,8]

bar = IncrementalBar('Countdown', max = len(mylist))

for item in mylist:
	bar.next()
	time.sleep(1)
	
bar.finish()
```
Результат работы:
![](https://habrastorage.org/getpro/habr/post_images/f89/560/66b/f8956066bc8771df24f3b195b73e9fb1.gif)

Есть индикаторы на любой вкус:

![](https://habrastorage.org/getpro/habr/post_images/466/0af/83f/4660af83f239a7d8e1f14a02fb8ed13d.gif)
# Используем tqdm

> Быстрый и расширяемый индикатор прогресса для Python и CLI

Всего один вызов функции понадобится для получения результата аналогичного предыдущему:

```python
import time
from tqdm import tqdm

mylist = [1,2,3,4,5,6,7,8]

for i in tqdm(mylist):
	time.sleep(1)
```
Получаем:
![](https://habrastorage.org/getpro/habr/post_images/77a/31b/de3/77a31bde39a1237549def40677d7d653.gif)

Само собой, в комплекте идёт куча настроек и опций.

# Используем alive-progress

Ещё один [вариант](https://github.com/rsalmei/alive-progress) синтаксиса, побольше дефолтных анимаций, чем в предыдущих примерах:

```python
from alive_progress import alive_bar
import time

mylist = [1,2,3,4,5,6,7,8]

with alive_bar(len(mylist)) as bar:
	for i in mylist:
		bar()
		time.sleep(1)
```
Результат:

![](https://habrastorage.org/getpro/habr/post_images/c60/529/2a0/c605292a0763b239ae950fc4fff0bfec.gif)

# GUI индикатор прогресса для скрипта

Иногда возникает необходимость предоставить конечному пользователю графический индикатор.

![](https://habrastorage.org/getpro/habr/post_images/f8a/fd7/70b/f8afd770b2c1c74dfac23dd492c686f5.gif)

Сколько кода нужно, чтобы достигнуть такого результата? Немного:
```python
import PySimpleGUI as sg
import time

mylist = [1,2,3,4,5,6,7,8]

for i, item in enumerate(mylist):
	sg.one_line_progress_meter('This is my progress meter!', i+1, len(mylist), '-key-')
	time.sleep(1)
```

# Индикатор в приложении PySimpleGUI

Рассмотрим реализацию индикатора в [PySimpleGUI](https://github.com/PySimpleGUI/PySimpleGUI).

![](https://habrastorage.org/getpro/habr/post_images/580/d8d/0a3/580d8d0a3e852ec2ef74db199755f2f6.gif)

Вот как это сделать:

```python
import PySimpleGUI as sg
import timemylist = [1,2,3,4,5,6,7,8]

progressbar = [
			[sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')]]
outputwin = [
	[sg.Output(size=(78,20))]
]

layout = [
	[sg.Frame('Progress',layout= progressbar)],
	[sg.Frame('Output', layout = outputwin)],
	[sg.Submit('Start'),sg.Cancel()]
]

window = sg.Window('Custom Progress Meter', layout)
progress_bar = window['progressbar']

while True:
	event, values = window.read(timeout=10)
	if event == 'Cancel'  or event is None:
		break
	elif event == 'Start':
		for i,item in enumerate(mylist):
			print(item)
			time.sleep(1)
			progress_bar.UpdateBar(i + 1)

window.close()
```
# Заключение

Как видите, нет ничего сложного в добавлении информации о прогрессе выполнения: кода немного, а отзывчивость повышается очень сильно. Используйте индикаторы, чтобы больше никогда не гадать, завис ли процесс или нет!

==========================================

![[telegram-cloud-photo-size-2-5337133182321027005-y.jpg]]