Графический интерфейс для замораживания индикатора выполнения Python PyQt4

следующий код подсчитывает, что количество индикаторов выполнения PyQt4 поднялось на 99%, я бы хотел, чтобы мой графический интерфейс НЕ зависал, поскольку они рассчитывают до 99%. Мне бы очень понравилось делать это без специальных классов или функций, если это возможно. Я знаю, что использовать классы - это хорошо, но для этого крошечного фрагмента кода я не хочу создавать класс. Из того, что я читал, может быть функция update (), которая могла бы выполнить это ... пожалуйста, сообщите, если я на правильном пути

import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore


app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.resize(400, 200)
widget.setWindowTitle('simple')
widget.show()

shift = 0
cntControl = 5
barra = [0] * cntControl
for i in range(cntControl):
    shift = shift + 10
    barra[i] = QtGui.QProgressBar(widget)
    barra[i].show()
    barra[i].setMinimum(0)
    barra[i].setMaximum(10000)
    barra[i].setGeometry(QtCore.QRect(10, shift, 200, 10))


for a in range(10000):
    for i in range(cntControl):
        barra[i].setValue(a)



sys.exit(app.exec_())

person Rhys    schedule 21.04.2011    source источник


Ответы (2)


попробуйте изменить цикл for с помощью:

while True:
    for a in range(10000):
        time.sleep(0.0001)
        for i in range(cntControl):
            barra[i].setValue(a)

если у меня работает. Цикл while продолжает бесконечно перемещать полосу. Если вы хотите очистить планку только после того, как она достигнет конца, вам следует использовать сброс:

PySide.QtGui.QProgressBar.reset()
Reset the progress bar. The progress bar “rewinds” and shows no
progress

Обновление после комментариев OP: если вы хотите, чтобы ваш графический интерфейс реагировал при входе в длинный цикл или другую операцию, вы должны использовать python модуль потока или QThreads.

person joaquin    schedule 21.04.2011
comment
Привет, спасибо за ответ. Мой вопрос на самом деле спрашивал ... почему мое главное окно ЗАМЕРЗИВАЕТСЯ, когда индикаторы выполнения движутся ... оно размораживается только после того, как все индикаторы выполнения завершены - person Rhys; 21.04.2011
comment
Я пытался запустить каждую полосу выполнения в отдельном потоке и получаю следующую ошибку: .... QObject :: installEventFilter (): не удается отфильтровать события для объектов в другом потоке. .... и ... QObject :: startTimer: таймеры не могут быть запущены из другого потока ... Я изучу Qthreads - person Rhys; 22.04.2011
comment
@Rhys: трудно узнать, что происходит с вашими потоками без реального кода, но ответ на ваш первоначальный вопрос стоит: используйте потоки. Вы должны опубликовать свой новый код и трассировку исключения, но это будет другой вопрос. - person joaquin; 22.04.2011
comment
QThreads работал отлично, спасибо. Примечание для всех, кто читает ... вам нужно будет изучить сигналы и излучение, если вы планируете попробовать Qthreads. - person Rhys; 26.04.2011

Я действительно не мог заставить потоки работать вообще ... Я мог опубликовать свою попытку обсуждения, которая выглядит безупречной для моих (теперь усталых) глаз ...

Однако мне удалось настроить http://zetcode.com/tutorials/pyqt4/widgets/ и получил следующий код ... который решает проблему зависания в графическом интерфейсе:

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.setWindowTitle('ProgressBar')
        self.setGeometry(300, 300, 250, 150)

        self.pbar = [0] * 3
        self.timer = [0] * 3
        self.step = [0] * 3
        self.shift = 0
        for i in range(3):
            self.shift = self.shift + 30
            self.pbar[i] = QtGui.QProgressBar(self)
            self.pbar[i].setGeometry(30, self.shift, 200, 25)

            self.timer[i] = QtCore.QBasicTimer()
            self.step[i] = 0
            self.timer[i].start(100, self)


    def timerEvent(self, event):
        for i in range(3):
            if self.step[i] >= 100:
                self.timer[i].stop()
                return
            self.step[i] = self.step[i] + 1
            self.pbar[i].setValue(self.step[i])




app = QtGui.QApplication(sys.argv) ex
= Example() ex.show() app.exec_()

У меня НЕТ ИДЕИ, почему это работает, что, вероятно, не очень хорошо. Я предполагаю, что это может иметь какое-то отношение к super(Example, self).__init__() и пользовательскому таймеру, который использует pyqt4. Я действительно надеялся сделать это без функций или классов, но не был уверен, что это возможно. Если вы думаете, что это так, не стесняйтесь писать!

person Rhys    schedule 22.04.2011