2011-04-21 102 views
1

以下代碼計算了一堆PyQt4進度條的最高99%,我想爲我的GUI 不要凍結,因爲它們的計數高達99%。如果可能的話,我很樂意做到這一點沒有自定義類或功能。 我知道使用類很好,但對於這個小代碼段我不想創建一個類。 從我讀過的有可能是可以完成這個update()函數...請告知,如果我在正確的軌道上Python PyQt4 progressbar凍結GUI

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_()) 

回答

1

試着改變你與循環:

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意見後:如果你想讓你的GUI輸入長外環或其他操作你什麼時候來響應應使用python thread moduleQThreads

+0

嗨,謝謝你的回覆。我的問題實際上是要求......爲什麼我的主窗口在進度條移動時凍結...一旦所有進度條完成,它只會解凍 – Rhys 2011-04-21 19:53:15

+0

我一直試圖在單個線程中運行每個進度條,並且出現以下錯誤:.... QObject :: installEventFilter():無法過濾不同線程中的對象的事件。 ....和... QObject :: startTimer:定時器不能從另一個線程啓動...我將研究Qthreads – Rhys 2011-04-22 10:04:52

+0

@Rhys:很難知道在沒有實際代碼的情況下,線程會發生什麼情況,但答案你最初的問題是:使用線程。你應該發佈你的新代碼和異常追溯,但這將是另一個問題。 – joaquin 2011-04-22 10:14:33

0

我實在堅持不下去的線程在所有的工作......我可以張貼我的線程試圖看起來完美無瑕,以我的(現疲態)的眼睛...

但我已經能夠tweek http://zetcode.com/tutorials/pyqt4/widgets/的例如進度,並與下面的代碼...這解決了GUI凍結的問題就出來了:

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使用有關。我真的希望在沒有功能或類的情況下做到這一點,但不確定這是可能的。如果您認爲這是真的,請隨時發佈!