¿Cómo actualizo la barra de progreso de pyqt5 en Ui_MainWindow?

Intento hacer que la barra de progreso se actualice en tiempo real con pyqt5, sin embargo, la documentación en línea parece muy limitada por ahora. Leí en línea que puedo usar el hilo y la señal para hacer eso. Sin embargo, la syntax parece haber cambiado en pyqt5. ¿Puede algún experto aquí ayudar?

Ventana principal de la interfaz de usuario.

# -*- coding: utf-8 -*- # # Created by: PyQt5 UI code generator 5.9 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets from sendInvoice import * class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(441, 175) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.progressBar = QtWidgets.QProgressBar(self.centralwidget) self.progressBar.setGeometry(QtCore.QRect(30, 20, 411, 61)) self.progressBar.setProperty("value", 0) self.progressBar.setObjectName("progressBar") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(160, 100, 75, 23)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 441, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.pushButton.clicked.connect(self.sendInvoice) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "Send")) def sendInvoice(self): sendInvoice.sendInv() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) 

Archivo del trabajador donde se está enviando la factura.

 import requests import json import sys from PyQt5.QtWidgets import (QWidget, QProgressBar, QPushButton, QApplication) class sendInvoice(): def sendInv(self): startInvNum = int(100) endInvNum = int(102) Username = 'test' Password = 'test' AccountNum = test environmentURL = 'http://www.test.com/api?INV' ##remove this temporary totalRequest = int(endInvNum) - int(startInvNum) n = 1 headerData = { 'Authorization': 'auth_email=' + Username + ', auth_signature=' + Password + ', auth_account=' + AccountNum, 'content-type': 'application/json', } QApplication.processEvents() for i in range(startInvNum, endInvNum+1): result = requests.get(environmentURL + str(i), headers=headerData) print (result.text) jsonOutput = json.loads(result.text) print (json.dumps(jsonOutput, sort_keys=True, indent=4)) self.currentCount = str(n) self.total = str(totalRequest) percentage = sendInvoice.getPercentage(self) print (percentage) QApplication.processEvents() n += 1 def getPercentage(self): count = int(self.currentCount) total = int(self.total) currentPercentage = (count / (total + 1) * 100) print(currentPercentage * 100) return currentPercentage 

No se recomienda modificar el archivo de diseño, es apropiado crear otro archivo para unir la lógica con el diseño. Por lo tanto, asumiré que el archivo de diseño se llama ui_mainwindow.py (debe eliminar todos los cambios)

 . ├── main.py ├── sendInvoice.py └── ui_mainwindow.py 

Su código es un poco desordenado, así que me tomo la libertad de mejorarlo, en este caso no usaré QThread, sino QThreadPool con QRunnable, y para enviar la información usaré QMetaObject:

con QThreadPool y QRunnable

SendInvoice.py

 from PyQt5 import QtCore import requests import json class InvoiceRunnable(QtCore.QRunnable): def __init__(self, progressbar): QtCore.QRunnable.__init__(self) self.progressbar = progressbar def run(self): startInvNum = 100 endInvNum = 102 Username = 'test' Password = 'test' AccountNum = 'test' environmentURL = 'http://www.test.com/api?INV' ##remove this temporary headerData = { 'Authorization': 'auth_email={}, auth_signature={}, auth_account={}'.format(Username, Password, AccountNum), 'content-type': 'application/json', } totalRequest = endInvNum - startInvNum + 1 for n, i in enumerate(range(startInvNum, endInvNum+1)): result = requests.get(environmentURL + str(i), headers=headerData) print (result.text) jsonOutput = json.loads(result.text) print(json.dumps(jsonOutput, sort_keys=True, indent=4)) print(n+1, totalRequest) currentPercentage = (n+1)*100/totalRequest QtCore.QMetaObject.invokeMethod(self.progressbar, "setValue", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(int, currentPercentage)) 

Uniremos ambas partes en main.py donde se creará el widget y realizaremos la conexión:

main.py

 from PyQt5 import QtCore, QtGui, QtWidgets from ui_mainwindow import Ui_MainWindow from sendInvoice import InvoiceRunnable class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QtWidgets.QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) self.progressBar.setRange(0, 100) self.pushButton.clicked.connect(self.sendInvoice) def sendInvoice(self): runnable = InvoiceRunnable(self.progressBar) QtCore.QThreadPool.globalInstance().start(runnable) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_()) 

con QThread

SendInvoice.py

 from PyQt5 import QtCore import requests import json class InvoiceThread(QtCore.QThread): percentageChanged = QtCore.pyqtSignal(int) def run(self): startInvNum = 100 endInvNum = 102 Username = 'test' Password = 'test' AccountNum = 'test' environmentURL = 'http://www.test.com/api?INV' ##remove this temporary headerData = { 'Authorization': 'auth_email={}, auth_signature={}, auth_account={}'.format(Username, Password, AccountNum), 'content-type': 'application/json', } totalRequest = endInvNum - startInvNum + 1 for n, i in enumerate(range(startInvNum, endInvNum+1)): result = requests.get(environmentURL + str(i), headers=headerData) print (result.text) jsonOutput = json.loads(result.text) print(json.dumps(jsonOutput, sort_keys=True, indent=4)) print(n+1, totalRequest) currentPercentage = (n+1)*100/totalRequest self.percentageChanged.emit(currentPercentage) 

main.py

 from PyQt5 import QtCore, QtGui, QtWidgets from ui_mainwindow import Ui_MainWindow from sendInvoice import InvoiceThread class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): QtWidgets.QMainWindow.__init__(self, *args, **kwargs) self.setupUi(self) self.progressBar.setRange(0, 100) self.pushButton.clicked.connect(self.sendInvoice) def sendInvoice(self): thread = InvoiceThread(self) thread.percentageChanged.connect(self.progressBar.setValue) thread.start() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_())