Python PyQt4 индикатор прогресса Freezing GUI - PullRequest
1 голос
/ 21 апреля 2011

в следующем коде подсчитано несколько процентов роста 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_())

Ответы [ 2 ]

1 голос
/ 21 апреля 2011

попробуйте изменить цикл 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 thread module или QThreads .

0 голосов
/ 22 апреля 2011

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

Я, однако, смог настроить * 1003Пример с индикатором хода выполнения *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.Я действительно надеялся сделать это без функций или классов, но не уверен, что это возможно.Если вы думаете, что это так, не стесняйтесь писать!

...