Besetzt-Anzeige mit PyQt und Fortschrittsbalken
Ich versuche, ein Skript zu schreiben, die Anzeige der besetzt-Anzeige
während der Durchführung der Aufgabe. Und wenn die Aufgabe ist vorbei, die Fortschritt-bar
füllen, die am Ende zeigen, dass eine 100% - Aufgabe ist abgeschlossen.
Ich möchte nur den Fortschrittsbalken, um zu zeigen, eine Aufgabe Los ist.Aber wenn ich starten
die Aufgabe, busy-Anzeige Stoppt.Es scheint mir, dass die Anzeige-und
die Aufgabe auch nicht weiter zusammen. Bitte helfen Sie mir. Hier ist mycode:
from PyQt4 import QtCore, QtGui
from time import sleep
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(344, 159)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.pb = QtGui.QProgressBar(self.centralwidget)
self.pb.setGeometry(QtCore.QRect(20, 20, 301, 31))
self.pb.setProperty("value", 0)
self.pb.setObjectName(_fromUtf8("pb"))
self.btn = QtGui.QPushButton(self.centralwidget)
self.btn.setGeometry(QtCore.QRect(20, 70, 98, 27))
self.btn.setObjectName(_fromUtf8("btn"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 344, 25))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QObject.connect(self.btn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.action)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def action(self):
self.pb.setRange(0, 0)
sleep(3) # Here I want to run a command.For example: os.system('copy something')
self.pb.setRange(0, 100)
self.pb.setValue(100)
QtGui.qApp.processEvents()
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.btn.setText(_translate("MainWindow", "Start", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
InformationsquelleAutor user2420437 | 2013-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, ist es eine schlechte Idee, direkt den code Bearbeiten erstellt mit QtDesigner. Sie haben vielleicht schon die Zeile
# WARNING! All changes made in this file will be lost!
an der Spitze des Dokuments. Für so ein einfaches widget, du bist besser dran mit manuellen Codierung.Zweitens, nehmen Sie einen genaueren Blick auf, was die
action
slot eigentlich nicht.Gibt es keinen Grund für deine progressBar aktualisieren Ihren Wert, während Sie Ihre slot blockiert, in
sleep
. Wennaction
heißt, der slot-thread schläft für 3 Sek, dann legt Sie den Fortschrittsbalken, um eine volle 100.Können Sie nicht erwarten, dass die progressBar auf Magische Weise selbst aktualisieren, während Sie Ihre Aufgabe ausgeführt wird. Wenn Sie haben keine Ahnung, wie lange es dauern wird, und Sie können nicht subdivise es in den Schritten, sollten Sie erwägen, eine gepulsten ProgressBar verwenden (siehe Beispiel 1 unten). Wenn Sie leicht bekommen kann das Fortschreiten der Ihre Aufgabe (sprich das kopieren von n Dateien), sollten Sie aktualisieren den Wert Ihrer progressBar entsprechend.
So oder so, sollten Sie
QThread
um eine nicht-blockierende Verhalten und diesignals
für die Kommunikation zwischen Ihrem thread(s) und Ihre main Anwendung.Beispiel 1 - Puls-ProgressBar:
Wenn minimum und maximum sind auf 0 eingestellt und der Fortschrittsbalken zeigt ein besetzt-Anzeige anstelle eines Prozentsatzes, der Schritte.
Beispiel 2 - Classic-ProgressBar:
Ich habe die zweite Arbeit !Vielen Dank Yoann.
Gibt es eine Möglichkeit zum aktualisieren der progressbar ohne eine neue Klasse? so etwas wie
def longtask() startprogressbar() logtask ... endprogressbar()
?Hervorragender Beitrag - danke !
Danke. Deine Antwort ist wirklich hilfreich. Ich habe versucht zu implementieren, die es zu lösen ein anderes problem, aber irgendwie bin ich gescheitert. Sie können bitte werfen Sie einen Blick auf meine Frage und sehen, ob Sie in der Lage sein könnte, mir zu helfen mit diesem problem? Hier ist der link:stackoverflow.com/questions/47256606/...
InformationsquelleAutor Yoann
Endlich bekam ich was ich wollte, obwohl wenig Bearbeitung nötig . Habe ich nur noch diese Zeile
zu onFinished():
selbst.progressBar.setValue(1)
um zu bestätigen, 100% Aufgabenerledigung.
Hier ist der code:
InformationsquelleAutor user2420437
Ein bisschen spät, aber ich habe eine schriftliche ausführliche Dokumentation zu diesem Thema, da eine Menge Leute scheinen mit diesem problem konfrontiert.
Einführung in Progress Bars
InformationsquelleAutor daegontaven
gelten:
Diese Einstellung haben einen anstrengenden Auftritt, müssen Sie nicht fügen Sie es zu jeder Funktion, es kann in den Konstruktor der Klasse, wenn Sie möchten,
InformationsquelleAutor Arturo Morales Rangel