Ich habe dieses einfache Programm, wo ich ein modales, nicht blockierendes Fortschrittsfenster haben möchte (mit einem QProgressDialog), das remote aktualisiert wird. SIZE
steuert einfach den Maximalwert von QProgressDialog. wenn ich es jedoch auf einen Wert von 4 oder weniger haben, sieht das Fenster wie dies während der gesamten Dauer der Maßnahme:PyQt QProgressDialog wird als leeres, weißes Fenster angezeigt
Mit anderen Worten, ist das Fenster komplett weiß und zeigt keinen Text noch Fortschrittsbalken. Wenn ich den Wert von SIZE
-5 oder mehr eingestellt, arbeitet das Display anzeigt, aber erst nach den ersten 2-3 Wiederholungen:
und später
import sys, time
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
SIZE = 5
def doGenerate(setValue):
for x2 in range(SIZE):
time.sleep(1)
setValue(x2 + 1)
print('Done')
class MainMenu(QMainWindow):
def __init__(self):
super().__init__()
self.genAudioButton = QPushButton('Generate', self)
self.genAudioButton.clicked.connect(self.generate)
self.setCentralWidget(self.genAudioButton)
self.show()
def generate(self):
try:
progress = QProgressDialog('Work in progress', '', 0, SIZE, self)
progress.setWindowTitle("Generating files...")
progress.setWindowModality(Qt.WindowModal)
progress.show()
progress.setValue(0)
doGenerate(progress.setValue)
except Exception as e:
errBox = QMessageBox()
errBox.setWindowTitle('Error')
errBox.setText('Error: ' + str(e))
errBox.addButton(QMessageBox.Ok)
errBox.exec()
return
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MainMenu()
ret = app.exec_()
sys.exit(ret)
Was verursacht das und wie kann ich es beheben?
Zusätzlich, ist es eine Möglichkeit, vollständig auf die Schaltfläche Abbrechen zu entfernen, anstatt eine leere Schaltfläche zu haben, die noch die Aktion abgebrochen? Die PyQt4-Dokumente (ich verwende PyQt5) zeigen an, dass ein leerer String dieses Ergebnis erreichen soll, und die C++ - Dokumente für Qt5 zeigen dasselbe an, aber das funktioniert hier eindeutig nicht. Ich habe keine eigenständige Dokumentation für PyQt5 gefunden.
Vielen Dank für Ihre Antwort. 'sleep' ist das, was ich verwendet habe, um ein minimales Beispiel zu schreiben, das das Problem reproduziert, aber mein ursprüngliches Programm schrieb tatsächlich Dateien in' doGenerate', anstatt zu schlafen. Das wurde nicht durch das Schreiben von nativen Python-Dateien gemacht, sondern durch die Verwendung von Funktionen aus einer Bibliothek, auf die ich wenig bis gar keine Kontrolle habe ('save' oder' write_to_fp' aus [gTTS] (https://github.com/pndurette/gTTS/)) . Wie kann ich Ihre Lösung darauf anpassen? – pie3636
@ pie3636 Wie erhalten Sie den Prozentsatz durch gTTs? Habe ich diese Bibliothek benutzt und keine Funktion gefunden, die mir den prozentualen Fortschritt anzeigt? – eyllanesc
Ich muss eine große Anzahl von Dateien erzeugen, also mache ich einfach, dass ich nach jeder Datei den Prozentsatz als 'files_done/total_files' berechne. Aber die Aktualisierung der GUI nach jeder Datei verursacht das Problem, wo das Fenster leer ist, weil das Schreiben in eine Datei blockiert ist, nehme ich an? – pie3636