Как сделать прогресс бар в python

Обновлено: 04.07.2024

Здравствуйте!
В моей программе имеется функция копирования файлов и директорий.
использую Tkinter для создания GUI, сделал прогрессбар, задача состоит в том, чтобы прогресс бар обновлялся в реальном времени во время копирования. Не знаю как связать эти два элемента вместе. Просьба помочь

Копирование файлов и ttk.Progressbar, как связать?

Отредактировано PEHDOM (Июль 3, 2017 21:44:34)

Копирование файлов и ttk.Progressbar, как связать?

Например вот такой код:

Копирование файлов и ttk.Progressbar, как связать?

ну примерно вот так:

это при условии что dst не существует, в таком случае оно само все сделает.
Иначе копировать пофайлово и проверять на существование

прогрессбар отбражает только к-во скопированых файлов,без учета размера. Если хотите с учетом размера то алгоритм будет сложнее.

Отредактировано PEHDOM (Июль 4, 2017 17:05:46)

Копирование файлов и ttk.Progressbar, как связать?

Спасибо, очень признателен. Буду пробовать

Копирование файлов и ttk.Progressbar, как связать?


Хотелось бы уточнить, первый скрипт работает замечательно. Но в моей ситуации мне нужно как раз таки второй вариант, когда dst уже существует (копировать файлы и папки в корень USB-флешки). Второй код не копирует ничего, хотя прогресс бар бежит. Извиняюсь за глупые вопросы, изучаю Python только 1ый месяц)

Я хочу иметь индикатор выполнения в отдельном потоке, поэтому он не замерзает приложение, но я не могу найти, как это сделать.

Кто-нибудь может помочь?

Я думаю, вы можете ошибаться. Вам нужна работа, которую вы делаете в отдельном потоке, чтобы она не затормозила приложение. Но вы также хотите обновить индикатор выполнения. Вы можете достичь этого, создав рабочий класс, используя QThread . QThreads могут излучать сигналы, которые ваш пользовательский интерфейс может прослушивать и действовать соответствующим образом.

Сначала создайте свой рабочий класс.

Итак, теперь, когда у вас есть рабочий класс, пришло время его использовать. Вам понадобится создать новую функцию в классе Ui_Dialog для обработки испускаемых сигналов.

Пока вы там, вы можете удалить свою функцию progress() .

в retranslateUi() вам нужно будет обновить обработчик событий кнопки с

Наконец, в вашей функции setupUI() вам нужно будет создать экземпляр вашего рабочего класса и подключить его к вашей функции setProgress() .

Вот окончательный код:

В QThreads есть встроенные сигналы, которые автоматически испускаются. Вы можете увидеть их и получить дополнительную информацию о QThreads в документации

Как использовать индикатор выполнения, когда мой script выполняет некоторую задачу, которая может занять некоторое время?

Например, функция, которая занимает некоторое время для завершения и возвращает True по завершении. Как я могу отображать индикатор выполнения во время выполнения функции?

Обратите внимание, что мне нужно, чтобы это было в режиме реального времени, поэтому я не могу понять, что с этим делать. Мне нужен thread для этого? Я понятия не имею.

Сейчас я ничего не печатаю во время выполнения функции, однако индикатор выполнения будет приятным. Также меня больше интересует, как это можно сделать с кодовой точки зрения.

Существуют определенные библиотеки (как здесь), но может быть что-то очень простое сделает:

Примечание. progressbar2 - это ответвление progressbar, которое не поддерживалось годами.

С tqdm вы можете добавить индикатор прогресса в ваши циклы в секунду:

Кроме того, существует графическая версия tqdm начиная с v2.0.0 ( d977a0c ):

tqdm gui window

Но будьте осторожны, поскольку tqdm_gui может вызвать TqdmExperimentalWarning: GUI is experimental/alpha , вы можете проигнорировать его, используя warnings.simplefilter("ignore") , но после этого он будет игнорировать все предупреждения в вашем коде.

Вышеприведенные предложения очень хороши, но я думаю, что большинство людей просто хотят готовое решение, без зависимости от внешних пакетов, но также можно использовать повторно.

Я получил лучшие точки всего вышеперечисленного и сделал его функцией, а также тестовые примеры.

Чтобы использовать его, просто скопируйте строки под "def update_progress (progress)", но не тест script. Не забудьте импортировать sys. Вызовите это, когда вам нужно отобразить или обновить индикатор выполнения.

Это работает, напрямую отправив символ "\ r" в консоль, чтобы переместить курсор в начало. "print" в python не выделяет вышеуказанный символ для этой цели, поэтому нам нужен "sys"

Вот что показывает результат теста script (последний анимированный индикатор выполнения):

Не требует второго потока. Некоторые решения/пакеты выше требуют. Второй поток может быть проблемой, например, для jupyter notebook .

Работает с любой итерацией, это означает, что можно использовать len() . list , dict чего-либо, например ['a', 'b', 'c'. 'g']

Вы также можете изменить вывод, например, изменив файл на sys.stderr

для аналогичного приложения (отслеживание хода в цикле) Я просто использовал python-progressbar:

В их примере идет что-то вроде этого,

В результате будет отображаться следующая строка:

Я просто сделал простой класс прогресса для своих нужд после поиска здесь эквивалентного решения. Я думал, что могу хорошо это записать.

[======== ] 17/80 ( 21%) 63 to go

Мне нравится Брайан Хуу ответить за его простоту и не нуждается в внешних пакетах. Я немного изменил его, поэтому добавляю свою версию здесь:

Требуется общее количество прогонов ( total ) и количество прогонов, обработанных до сих пор ( progress ), предполагая total >= progress . Результат выглядит следующим образом:

Вы можете использовать tqdm:

В этом примере индикатор выполнения работает в течение 5 минут, и он показан так:

Вы можете изменить его и настроить по своему усмотрению.

Мне очень нравится python-progressbar, так как он очень прост в использовании.

Для самого простого случая это просто:

Внешний вид может быть настроен, и он может отображать приблизительное оставшееся время. Для примера используйте тот же код, что и выше, но с:

Если это большой цикл с фиксированным количеством итераций, который занимает много времени, вы можете использовать эту функцию, которую я сделал. Каждая итерация цикла добавляет прогресс. Если count - текущая итерация цикла, общее значение - это значение, которое вы зацикливаете, а размер (int) - это то, насколько вы хотите, чтобы полоса с шагом 10, т.е. (Размер 1 = 10 символов, размер 2 = 20 символов)

Используйте эту библиотеку: fish (GitHub).

Код ниже является довольно общим решением, а также имеет время, прошедшее и оставшееся время. Вы можете использовать любой итеративный вариант. Индикатор выполнения имеет фиксированный размер в 25 символов, но он может показывать обновления с шагом 1% с использованием полных, половинных и четверть блоков символов. Результат выглядит следующим образом:

Предложения по улучшению или другие комментарии приветствуются. Повеселись.

Это довольно просто в Python3:

При работе в ноутбуках Jupyter использование обычного tqdm не работает, так как записывает вывод в несколько строк. Используйте это вместо:

Мне нравится эта страница.

Начинается с простого примера и переходит на многопоточную версию. Работает из коробки. Не требуется сторонних пакетов.

Код будет выглядеть примерно так:

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

Если ваша работа не может быть разбита на измеримые куски, вы можете вызвать свою функцию в новом потоке и времени, сколько времени потребуется:

Вы можете, очевидно, увеличить точность синхронизации.

Здесь короткое решение, которое программно создает панель загрузки (вы должны решить, сколько времени вы хотите).

Попробуйте PyProg. PyProg - это библиотека с открытым исходным кодом для Python для создания супер настраиваемых индикаторов и индикаторов прогресса.

В настоящее время он находится в версии 1.0.2; он размещен на Github и доступен на PyPI (ссылки ниже). Он совместим с Python 3 и 2, и его также можно использовать с Qt Console.

Он очень прост в использовании. Следующий код:

Я действительно сделал PyProg, потому что мне нужна простая, но супер настраиваемая библиотека индикаторов выполнения. Вы можете легко установить его с помощью: pip install pyprog .

Вы также можете использовать просвет. Главное преимущество - вы можете входить в систему одновременно, не перезаписывая индикатор выполнения.

Он также обрабатывает несколько индикаторов выполнения.

Чтобы использовать любые рамки индикаторов прогресса полезным способом, например, чтобы получить фактический процент прогресса и предполагаемое ETA, вы должны иметь возможность объявить, сколько шагов у него будет.

Итак, ваша вычислительная функция в другом потоке, вы можете разделить ее на несколько логических шагов? Можете ли вы изменить его код?

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


Интересуюсь по большей части системным анализом программного обеспечения: поиском багов и анализом неисправностей, а также системным программированием (и не оставляю надежд запилить свою операционку, хотя нехватка времени сказывается :) ). Программированием увлекаюсь с 12 лет, но так уж получилось, что стал я инженером.

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

Читайте также: