Python-PySide " und der Fortschrittsbalken Threading
Habe ich diesen code:
from PySide import QtCore, QtGui
import time
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 133)
self.progressBar = QtGui.QProgressBar(Dialog)
self.progressBar.setGeometry(QtCore.QRect(20, 10, 361, 23))
self.progressBar.setProperty("value", 24)
self.progressBar.setObjectName("progressBar")
self.pushButton = QtGui.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(20, 40, 361, 61))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Dialog", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
self.progressBar.setValue(0)
self.pushButton.clicked.connect(self.progress)
def progress(self):
self.progressBar.minimum = 1
self.progressBar.maximum = 100
for i in range(1, 101):
self.progressBar.setValue(i)
time.sleep(0.1)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Dialog = QtGui.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
Möchte ich den Fortschrittsbalken in einem separaten thread, damit es nicht einfrieren, bis die Anwendung, aber ich kann nicht scheinen, um herauszufinden, wie dies zu tun.
Kann bitte jemand helfen?
InformationsquelleAutor der Frage Benny | 2013-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denke ich, können Sie verwechselt werden. Sie möchten die Arbeit, die Sie tun in einem separaten thread, so dass es nicht einfrieren der Anwendung. Aber Sie wollen auch in der Lage sein, die Statusanzeige zu aktualisieren. Sie können dies erreichen, durch die Schaffung einer Arbeiter Klasse mit einem
QThread
. QThreads in der Lage sind, Signale aussenden, die Ihre UI-horchen und entsprechend reagieren.Erstellen wir als erstes Ihre Arbeiter Klasse.
So, jetzt, dass Sie eine worker-Klasse, ist es Zeit, es zu nutzen. Möchten Sie eine neue Funktion in Ihrer
Ui_Dialog
Klasse zu behandeln, die abgegebene Signale.Während Sie dort sind, können Sie entfernen Sie Ihre
progress()
Funktion.in
retranslateUi()
Sie aktualisieren möchten, die push-button-event-handler vonzu
Schließlich in Ihrem
setupUI()
- Funktion, müssen Sie erstellen eine Instanz der worker-Klasse und verbinden Sie die signal-zu IhremsetProgress()
Funktion.Bevor diese:
Hinzufügen:
Ist hier der endgültige code:
QThreads einige haben eingebaute Signale, die automatisch ausgegeben. Du kannst Sie sehen, und mehr Informationen über QThreads in der Dokumentation
InformationsquelleAutor der Antwort smont
Es ist ein Fehler zu denken, Sie müssen immer für die Verwendung von multi-threading für Dinge wie diese.
Wenn Sie brechen Ihre lange andauernde Aufgabe in eine Reihe von kleinen Schritten, alles, was Sie tun müssen, ist sicherzustellen, dass alle ausstehenden Ereignisse werden verarbeitet, ausreichend oft für die GUI, um reaktionsfähig bleiben. Diese kann getan werden, sicher aus der innerhalb die Haupt-GUI-thread mittels processEventswie diese:
Gegeben, es ist die Einfachheit, es lohnt sich immer, zumindest mit dieser Technik, bevor Sie sich für eine viel komplexere Lösung wie multi-threading oder multi-processing.
InformationsquelleAutor der Antwort ekhumoro