Pyqt5 progressbar как привязать к программе
Перейти к содержимому

Pyqt5 progressbar как привязать к программе

  • автор:

Отображение процентов QProgressBar [дубликат]

Экземпляр создается в другом классе, а текущее количество процентов предполагалось передавать через функцию loading() . Самый простой пример:

pb = ProgressBar() for i in range(100): pb.loading(i) time.sleep(1) 

В итоге, ProgressBar создается, но отображается как пустой виджет до тех пор, пока не наступить 100% , потом закрывается. Видимо, где-то нужно правильный сигнал указать, попробовал несколько вариантов установить слот и сигнал через valueChanged() — не сработало.
Подскажите, как починить?

Отслеживать
75.3k 120 120 золотых знаков 38 38 серебряных знаков 57 57 бронзовых знаков
задан 3 мар 2019 в 10:34
82 7 7 бронзовых знаков
Покажите как вы «передаёте текущее количество процентов через функцию loading».
3 мар 2019 в 11:00
Добавил в вопрос
3 мар 2019 в 11:41
3 мар 2019 в 11:53

не знаю как это будет в питоне, но на C++ надо давать поработать циклу сообщений, т. е. вызывать QCoreApplication::processEvents для отображения изменений

3 мар 2019 в 12:10
по вашему наверно надо в цикле вызывать QApplication.processEvents() , после pb.loading(i)
3 мар 2019 в 12:29

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Тяжелые задачи, как правило работают в отдельных потоках. Из которых переодически передаются данные в графический интерфейс, в том числе и для отображения например в индикаторе выполнения. Но так как неясно, что вы делаете, нет минимального примера, приведу пример демонстрации ProgressBar с использованием QTimer.

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * class Widget(QWidget): def __init__(self): super().__init__() self.pbar = QProgressBar(self) self.percentage = 0 self.pbar.setTextVisible(self.percentage) self.pbar.setValue(self.percentage) button = QPushButton("Старт ProgressBar") button.clicked.connect(self.onClicked) self.gridLayout = QGridLayout(self) self.gridLayout.addWidget(self.pbar) self.gridLayout.addWidget(button) def onClicked(self): self.timer = QTimer(self) self.timer.timeout.connect(self.ProgressBar) self.timer.start(500) def ProgressBar(self): self.pbar.setValue(self.percentage) self.pbar.setTextVisible(self.percentage) if self.percentage >= 100: self.timer.stop() self.percentage = 0 else: self.percentage += 5 if __name__ == '__main__': import sys app = QApplication(sys.argv) w = Widget() w.setGeometry(400, 300, 300, 150) w.setWindowTitle('Demo ProgressBar') w.show() sys.exit(app.exec()) 

Виджеты в PyQt5

Python 3 логотип

Виджеты – это основные строительные кирпичики приложения. PyQt5 имеет множество разнообразных виджетов, включая кнопки, чекбоксы, ползунки и списки. В этой части руководства, мы опишем несколько полезных виджетов: QCheckBox, ToggleButton, QSlider, QProgressBar и QCalendarWidget.

QCheckBox (чекбокс)

QCheckBox – чекбокс (виджет, который имеет два состояния: включен и выключен). Как правило, чекбоксы используют для функций приложения, которые могут быть включены или выключены.

В нашем примере, мы создаём чекбокс, который переключает заголовок окна.
Это конструктор QCheckBox.
Мы установили заголовок окна так, что мы должны к тому же проверять чекбокс. По умолчанию, заголовок окна не установлен и чекбокс выключен.
Мы связываем наш метод changeTitle(), с сигналом stateChanged. Метод changeTitle() будет переключать заголовок окна.
Если виджет помечен галочкой, мы устанавливаем заголовок окна. В противном случае, мы устанавливаем пустую строку в заголовке.

Кнопка переключателя (toogle button)

Кнопка переключателя – это QPushButton в особом режиме. Это кнопка, которая имеет два состояния: нажатое и не нажатое. Мы переключаемся между этими двумя состояниями, кликая по ней. Существуют ситуации, где эта функциональность отлично подходит.

 "  " В нашем примере, мы создаём три кнопки переключателя и QWidget. Мы устанавливаем чёрный цвет фона. Кнопки переключателей будут переключать красные, зелёные и синие части значений цвета. Цвет фона будет зависеть от того, на какие кнопки переключателей мы нажали.
Это начальное значение цвета (чёрный).
Чтобы создать кнопку переключателя, мы создаём QPushButton и делаем её проверяемой, путём вызова метода setCheckable().
Мы привязываем сигнал к нашему пользовательскому методу. Мы используем сигнал clicked, который работает с логическим значением.
Мы получаем кнопку, которая была переключена.
В случае кнопки red, мы обновляем красную часть цвета соответственно.
 " Мы используем таблицы стилей, чтобы менять цвет фона.

QSlider (ползунок)

Qslider – ползунок (виджет, который имеет простой регулятор). Этот регулятор может быть утянут назад и вперёд. Таким способом, мы выбираем значение для конкретной задачи. Иногда, использование ползунка более естественно, чем ввод числа или использование переключателя-счётчика. В нашем примере, мы покажем один ползунок и одну метку. Метка будет показывать изображение. Ползунок будет контролировать метку.

В нашем примере, мы симулируем контроль громкости. Путём перетаскивания регулятора ползунка, мы меняем изображение на метке.
Здесь мы создаём горизонтальный ползунок.
Мы создаём виджет QLabel и устанавливаем начальное изображение "Mute" на него.
Мы привязываем сигнал valueChanged к определенному нами методу changeValue().
Основываясь на значении ползунка, мы устанавливаем изображение на метку. В коде выше, мы устанавливаем изображение mute.png на метку, если ползунок приравнен к нулю.

QProgressBar (прогресс бар)

QProgressBar – прогресс бар (виджет, который используется, когда мы обрабатываем продолжительные задачи). Он анимирует процесс, чтобы пользователи знали, что задача продвигается. Мы можем установить минимальное и максимальное значение для прогресс бара. Значения по умолчанию – 0 и 99.

В нашем примере, мы имеем горизонтальный индикатор прогресса и кнопку. Кнопка запускает и останавливает индикатор прогресса.
Это конструктор QProgressBar.
Чтобы активировать индикатор прогресса, мы используем объект таймера.
Чтобы запустить событие таймера, мы вызываем его методом start(). Этот метод имеет два параметра: таймаут, и объект, который будет принимать события.
Каждый QObject и его наследники имеют обработчик событий timerEvent(). Для того, чтобы реагировать на события таймера, мы переопределяем обработчик событий.
Внутри метода doAction(), мы запускаем и останавливаем таймер.

QCalendarWidget (виджет календаря)

QCalendarWidget предоставляет виджет помесячного календаря. Он позволяет пользователю выбирать дату простым и интуитивно-понятным способом.

Пример имеет виджет календаря и виджет метки. Текущая выбранная дата отображается в виджете метки.
Если мы выбираем дату из виджета, срабатывает сигнал clicked[QDate]. Мы присоединяем этот сигнал к пользовательскому методу showDate().
Мы возвращаем выбранную дату путём вызова метода selectedDate(). Тогда мы превращаем объект даты в строку и устанавливаем его в виджет метки.

В этой части руководства PyQt5, мы изучили некоторые виджеты.

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Отслеживаем прогресс выполнения в Python

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

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

Используем Progress

Первым у нас идёт модуль Progress.

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

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

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

Используем tqdm

Следующей на очереди идёт библиотека tqdm.

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

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

import time from tqdm import tqdm mylist = [1,2,3,4,5,6,7,8] for i in tqdm(mylist): time.sleep(1)

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

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

Ещё один вариант синтаксиса, побольше дефолтных анимаций, чем в предыдущих примерах:

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)

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

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

Сколько кода нужно, чтобы достигнуть такого результата? Немного:

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.

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

import PySimpleGUI as sg import time mylist = [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()

Заключение

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

  • progress bar
  • индикатор прогресса

PyQt5: как правильно назначить событие на кнопку?

Привет всем. Пишу тут утилиту для создания загрузочных флешек. На PyQt 5. Делаю всё согласно книге (да много источников просматривал) Для создания главного окна применял Qt Designer, затем конвертировал форму в класс Python. Создал ещё один файл, подключил форму, всё работает. Прописываю действие для кнопки (открытие диалога About), функцию, запускаю приложение - и кнопка не работает. Что только не перепробовал уже. Такое чувство что интерпретатор тупо игнорит строку с назначением обработчика, ибо даже если там намеренно сделать ошибку - прога запускается как ни в чём не бывало. Где ошибка? Вот форма:

# -*- coding: utf-8 -*- from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(420, 301) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setMinimumSize(QtCore.QSize(420, 301)) MainWindow.setMaximumSize(QtCore.QSize(420, 301)) icon = QtGui.QIcon.fromTheme("drive-removable-media") MainWindow.setWindowIcon(icon) self.centralWidget = QtWidgets.QWidget(MainWindow) self.centralWidget.setObjectName("centralWidget") self.label = QtWidgets.QLabel(self.centralWidget) self.label.setGeometry(QtCore.QRect(10, 0, 59, 21)) self.label.setObjectName("label") self.comboBox = QtWidgets.QComboBox(self.centralWidget) self.comboBox.setGeometry(QtCore.QRect(10, 20, 401, 32)) self.comboBox.setObjectName("comboBox") self.label_2 = QtWidgets.QLabel(self.centralWidget) self.label_2.setGeometry(QtCore.QRect(10, 60, 59, 18)) self.label_2.setObjectName("label_2") self.toolButton = QtWidgets.QToolButton(self.centralWidget) self.toolButton.setGeometry(QtCore.QRect(380, 80, 33, 34)) self.toolButton.setText("") icon = QtGui.QIcon.fromTheme("document-open") self.toolButton.setIcon(icon) self.toolButton.setObjectName("toolButton") self.label_3 = QtWidgets.QLabel(self.centralWidget) self.label_3.setGeometry(QtCore.QRect(10, 120, 41, 18)) self.label_3.setObjectName("label_3") self.lineEdit = QtWidgets.QLineEdit(self.centralWidget) self.lineEdit.setGeometry(QtCore.QRect(10, 140, 201, 32)) self.lineEdit.setObjectName("lineEdit") self.label_4 = QtWidgets.QLabel(self.centralWidget) self.label_4.setGeometry(QtCore.QRect(220, 120, 71, 18)) self.label_4.setObjectName("label_4") self.comboBox_3 = QtWidgets.QComboBox(self.centralWidget) self.comboBox_3.setGeometry(QtCore.QRect(220, 140, 191, 32)) self.comboBox_3.setObjectName("comboBox_3") self.comboBox_3.addItem("") self.comboBox_3.addItem("") self.comboBox_3.addItem("") self.line = QtWidgets.QFrame(self.centralWidget) self.line.setGeometry(QtCore.QRect(10, 180, 401, 16)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.progressBar = QtWidgets.QProgressBar(self.centralWidget) self.progressBar.setGeometry(QtCore.QRect(10, 210, 401, 23)) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.cancelButton = QtWidgets.QPushButton(self.centralWidget) self.cancelButton.setGeometry(QtCore.QRect(320, 260, 88, 34)) icon = QtGui.QIcon.fromTheme("dialog-cancel") self.cancelButton.setIcon(icon) self.cancelButton.setObjectName("cancelButton") self.writeButton = QtWidgets.QPushButton(self.centralWidget) self.writeButton.setGeometry(QtCore.QRect(230, 260, 88, 34)) icon = QtGui.QIcon.fromTheme("dialog-ok") self.writeButton.setIcon(icon) self.writeButton.setObjectName("writeButton") self.aboutButton = QtWidgets.QPushButton(self.centralWidget) self.aboutButton.setGeometry(QtCore.QRect(10, 260, 88, 34)) icon = QtGui.QIcon.fromTheme("help-about") self.aboutButton.setIcon(icon) self.aboutButton.setObjectName("aboutButton") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralWidget) self.lineEdit_2.setGeometry(QtCore.QRect(10, 80, 361, 32)) self.lineEdit_2.setObjectName("lineEdit_2") MainWindow.setCentralWidget(self.centralWidget) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "QImageWriter")) self.label.setText(_translate("MainWindow", "Device:")) self.label_2.setText(_translate("MainWindow", "ISO:")) self.label_3.setText(_translate("MainWindow", "Label:")) self.lineEdit.setText(_translate("MainWindow", "USB_STICK")) self.label_4.setText(_translate("MainWindow", "Filesystem:")) self.comboBox_3.setItemText(0, _translate("MainWindow", "FAT32")) self.comboBox_3.setItemText(1, _translate("MainWindow", "NTFS")) self.comboBox_3.setItemText(2, _translate("MainWindow", "EXT4")) self.cancelButton.setText(_translate("MainWindow", "Cancel")) self.writeButton.setText(_translate("MainWindow", "Write")) self.aboutButton.setText(_translate("MainWindow", "About")) 

Вот код исполняемого файла:

#!/usr/bin/env python3 from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox from mainwindow import * import sys class QImageWriter (QMainWindow, Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) self.window = QtWidgets.QMainWindow() self.setupUi(self.window) self.aboutButton.clicked.connect(self.about) def about(self): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('QImageWriter - a tool for write disk images to USB drive, written on PyQt5\nThis program redistributed under GNU GPLv3 license. \ Copyright (C) 2017 Aleksey Samoilov aka Sunderland93') msg.setWindowTitle('About') msg.exec_() if __name__ == '__main__': app = QApplication(sys.argv) window = QMainWindow() ui = Ui_MainWindow() ui.setupUi(window) window.show() sys.exit(app.exec_()) 

Sunderland93 ★★★★★
15.05.17 07:28:09 MSK

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *