Пишу программу на pyqt5 + qml.
По кнопке провожу вычисления и необходимо выводить прогресс выполнения вычисления.
В консоль прогресс выводится отлично, а вот gui на время вычисления зависает и оживает только после выполнения и пишет статус "готово".
Пробовал вычисления делать в одном потоке, а рисовать gui в другом - результат остается неизменный
Как сделать чтобы gui не зависал при вычислении?
#!/usr/bin/python
import apt
import time
import threading
import mysql.connector
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty
from PyQt5.QtQml import QQmlApplicationEngine
class Application(QObject, apt.progress.base.InstallProgress):
def __init__(self):
QObject.__init__(self)
apt.progress.base.InstallProgress.__init__(self)
self._pkg = None
self.progress = 0.
self.last = 0.0
progressResult = pyqtSignal(float, arguments=['progress'])
def start_update(self):
pass
def finish_update(self):
self.last = 100.0
self.progressResult.emit(self.last)
print self.last
print "finish"
def status_change(self, pkg, percent, status):
if percent <= 100.0:
self.last = percent
self.progressResult.emit(self.last)
print self.last
def update_interface(self):
apt.progress.base.InstallProgress.update_interface(self)
# usefull to e.g. redraw a GUI
time.sleep(0.1)
@pyqtSlot(str)
def removePackage(self, packName):
self._c = apt.Cache()
self._pkg = self._c[packName]
if self._pkg.is_installed:
self._pkg.mark_delete(True, True)
try:
threading.Thread(target=self._c.commit(install_progress=Application()), daemon=True).start()
except:
pass
self.progressResult.emit(100)
self._c.close()
def window():
import sys
# Create an instance of the application
app = QGuiApplication(sys.argv)
# Create QML engine
engine = QQmlApplicationEngine()
# Create a calculator object
application = Application()
# And register it in the context of QML
engine.rootContext().setContextProperty("application", application)
# Load the qml file into the engine
engine.load("qml/main.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
# Main Function
if __name__ == '__main__':
window()