私はリモートで更新されるモーダルで非ブロッキングの進捗ウィンドウ(QProgressDialogを使用)を使用したいこの簡単なプログラムを持っています。 SIZE
は、単にQProgressDialogの最大値を制御します。言い換えればPyQt QProgressDialogは白い空白のウィンドウとして表示されます
は、窓が完全に白で表示されていないテキスト:私は4以下の値を持つようにそれを設定する場合は、ウィンドウは、アクションの全期間中にこのようになります。プログレスバーもありません。私が5以上にSIZE
の値を設定した場合、表示が正しく動作しますが、唯一の2-3最初のイテレーションの後:
以降
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)
これを引き起こしていると私はそれを修正する方法は?
さらに、完全に代わりまだがアクションをキャンセルし、空のボタンを有していると、キャンセルボタンを削除する方法はありますか? PyQt4のドキュメント(私はPyQt5を使用しています)は、空の文字列がこの結果を達成し、Qt5のC++ドキュメントが同じことを示していることを示していますが、ここではうまくいきません。 PyQt5のスタンドアロンのドキュメントは見つかりませんでした。
ありがとうございました。 'sleep 'は私が問題を再現した最小限の例を書いたものですが、私の元のプログラムは実際にsleepの代わりに' doGenerate'の中のファイルに書き込んでいました。これは、ネイティブのpythonファイルの書き方ではなく、私がほとんどコントロールすることのできないライブラリの関数を使用していました([gTTS](https://github.com/pndurette/gTTS/)の 'save'または' write_to_fp') 。どのように私はあなたのソリューションを適応させることができますか? – pie3636
@ pie3636 gTTを使ってパーセンテージをどのように取得しますか?そのライブラリを使用していて、進捗率を教えてくれる関数が見つかりませんでしたか? – eyllanesc
私はたくさんのファイルを生成しなければならないので、単純にファイルごとに 'files_done/total_files'を計算します。しかし、ファイルへの書き込みがブロックされているので、各ファイルの後にGUIを更新すると、ウィンドウが空白の問題が発生するでしょう。 – pie3636