Как сделать, чтобы этот индикатор выполнения закрывался, когда это делается

Я обычно пишу скрипты на Python, чтобы выполнять задачи преобразования для себя, и всякий раз, когда я пишу скрипт, который требует времени, я использую этот маленький индикатор выполнения, чтобы проверить его.

import sys
import time
from PyQt4 import QtGui
app = QtGui.QApplication(sys.argv)
barra = QtGui.QProgressBar()
barra.show()
barra.setMinimum(0)
barra.setMaximum(10)
for a in range(10):
    time.sleep(1)
    barra.setValue(a)
app.exec_()

У меня есть 2 вопроса:

Как мне заставить его закрыться, когда он достигает 100% (он остается открытым, и если вы закроете оболочку Python до нажатия кнопки X, вы сломаете ее.)

Кроме того, когда он теряет и восстанавливает фокус, он перестает правильно рисовать. процесс будет продолжаться до завершения, но пространство индикатора выполнения будет полностью белым. Как мне справиться с этим?


person Nathan    schedule 09.04.2009    source источник


Ответы (1)


Ну, поскольку вы установили Максимум на 10, индикатор выполнения не должен достигать 100%, потому что

for a in range(10):
  time.sleep(1)
  barra.setValue(a)

будет повторяться только до 9.

Индикаторы выполнения не закрываются автоматически. Вам придется позвонить

barra.hide()

после вашего цикла.

Что касается проблемы с краской, это, вероятно, связано с тем, что любой скрипт, из которого вы запустили этот скрипт, находится в том же потоке, что и индикатор выполнения. Поэтому, когда вы отключаетесь и возвращаетесь назад, события рисования задерживаются фактической обработкой родительского сценария. Вы можете либо установить таймер для периодического вызова .update() или .repaint() на 'barra' (update() рекомендуется вместо repaint()) ИЛИ вы хотите, чтобы ваш основной код обработки выполнялся в QThread, который также доступен в коде PyQt, но это потребует некоторого чтения с вашей стороны :)

Документ предназначен для Qt, но он также применим и к PyQt:

https://doc.qt.io/qt-4.8/threads.html

person Community    schedule 09.04.2009