Как обновить индикатор выполнения с помощью pyqt4 - PullRequest
0 голосов
/ 04 марта 2019

Вот пример программы. Я хочу обновить мой индикатор выполнения с помощью pyqt4.И я хочу показать, что 30% сохранения данных и еще 60% обработки данных. Я выполняю свою программу, которую она прерывает.Пожалуйста, помогите мне, как обновить мой индикатор выполнения. Спасибо заранее.Ниже приведен мой код:

import sys
import time
from pyface.qt import QtGui, QtCore
global X,Y
X= 5
Y= 4

import threading
class SaveWorker(QtCore.QObject):
    progress_update = QtCore.Signal(int)
    def save_file(self):
        while True:
            MyCustomWidget().updateProgressBar()

class Dialog(QtGui.QDialog):
    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)
        self.setStyleSheet("QDialog {background-color:black; color:white }")
        self.label1 = QtGui.QLabel(
            text="Please Wait...",
            font=QtGui.QFont("Times", 20,weight=QtGui.QFont.Bold)
        )
        self.progress = QtGui.QProgressBar()
        self.box = QtGui.QVBoxLayout()
        self.label2 = QtGui.QLabel()
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.label1)
        vbox.addLayout(self.box)
        self.show_gif()
    def show_gif(self):
        self.progress = QtGui.QProgressBar()
        self.progress.setRange(0,100)

        self.box.addWidget(self.progress)
        self.show()
class MyCustomWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyCustomWidget, self).__init__(parent)
        self.worker = SaveWorker()
        self.gif_dialog = Dialog()
        self.worker.progress_update.connect(self.gif_dialog.show_gif)
        thread = threading.Thread(target=self.worker.save_file)
        thread.daemon = True
        thread.start()
        self.progressPer = 0
        fileList = []

        processes = []
        _dataSavingPer = 30.0/(X*Y)
        for i in range(X*Y):
            name =  'file'+str(i+1) + ".txt"
            fileList.append(name)
            self.progressPer += _dataSavingPer
            self.updateProgressBar(self.progressPer)
            #updating the progress bar
        _dataProcessPer = 60.0/(X*Y)
        for file in fileList:
            process = 'fileProcess'+str(i+1) + ".txt"
            processes.append(process)
            self.progressPer += _dataProcessPer
            self.updateProgressBar(self.progressPer)
            #Updating the progressPer
            #how can i update these two values in to progressbar
    def updateProgressBar(self,value):
            self.gif_dialog.progress.setValue(value)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyCustomWidget()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 04 марта 2019

Я не понимаю, что вы пытались написать при написании следующего:

class SaveWorker(QtCore.QObject):
    progress_update = QtCore.Signal(int)
    def save_file(self):
        while True:
            MyCustomWidget().updateProgressBar()

updateProgressBar требует значения, через какое значение вы проходите ?, с другой стороны, при использовании MyCustomWidget(), который вы создаетеобъект, отличный от показанного, и объект MyCustomWidget не должен создаваться в другом потоке.

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

import sys
import threading
from pyface.qt import QtGui, QtCore

X, Y = 5, 4

class SaveWorker(QtCore.QObject):
    progressChanged = QtCore.Signal(int)

    def save_file(self):
        fileList = []
        processes = []
        _dataSavingPer = 30.0/(X*Y)
        progress = 0
        for i in range(X*Y):
            name =  'file'+str(i+1) + ".txt"
            fileList.append(name)
            progress += _dataSavingPer
            self.progressChanged.emit(progress)
        _dataProcessPer = 60.0/(X*Y)
        for file in fileList:
            process = 'fileProcess'+str(i+1) + ".txt"
            processes.append(process)
            progress += _dataProcessPer
            self.progressChanged.emit(progress)

class Dialog(QtGui.QDialog):
    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)
        self.setStyleSheet("QDialog {background-color:black; color:white }")
        self.label1 = QtGui.QLabel(
            text="Please Wait...",
            font=QtGui.QFont("Times", 20,weight=QtGui.QFont.Bold)
        )
        self.progress = QtGui.QProgressBar()
        self.box = QtGui.QVBoxLayout()
        self.label2 = QtGui.QLabel()
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.label1)
        vbox.addLayout(self.box)
        self.show_gif()

    def show_gif(self):
        self.progress = QtGui.QProgressBar()
        self.progress.setRange(0,100)
        self.box.addWidget(self.progress)
        self.show()

class MyCustomWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyCustomWidget, self).__init__(parent)
        self.worker = SaveWorker()
        self.gif_dialog = Dialog()
        self.worker.progressChanged.connect(self.gif_dialog.progress.setValue)
        thread = threading.Thread(target=self.worker.save_file)
        thread.daemon = True
        thread.start()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyCustomWidget()
    sys.exit(app.exec_())
...