2009-12-20 84 views
3

下面的程序應該計數和int並在標籤中顯示它的值。 但過了一段時間,GUI停止工作,而循環連續。PyQt 4用戶界面凍結

from PyQt4 import QtGui,QtCore 
import sys 

class main_window(QtGui.QWidget): 
    def __init__(self,parent=None): 
     #Layout  
     QtGui.QWidget.__init__(self,parent) 
     self.bt=QtGui.QPushButton('crash') 
     self.lbl=QtGui.QLabel('count') 
     ver=QtGui.QHBoxLayout(self) 
     ver.addWidget(self.bt) 
     ver.addWidget(self.lbl) 
     self.cnt=0 
     self.running=False 
     self.connect(self.bt,QtCore.SIGNAL("clicked()"),self.count) 

    def count(self): 
     self.running=True 
     while self.running: 
      self.cnt+=1 
      print self.cnt 
      self.lbl.setText(str(self.cnt)) 
      self.repaint() 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    mw=main_window() 
    mw.show() 
    sys.exit(app.exec_()) 

任何幫助?

回答

4
def count(self): 
    self.running=True 
    while self.running: 
     self.cnt+=1 
     print self.cnt 
     self.lbl.setText(str(self.cnt)) 
     self.repaint() 

你有沒有想過從這個無限循環的任何退出?例如。 self.running=False
GUI可能會停止工作,因爲它沒有足夠的時間執行repaint。您可能需要在循環中添加一些time.sleep以等待GUI重新繪製。

Upd .:對於您正在實施的行爲,您應該使用QTimer而不是簡單的while循環。

+0

我試圖儘可能簡化我的問題,所以是的,計劃停止按鈕。 放入一段時間睡眠命令甚至會使gui更快地崩潰。 – tillsten 2009-12-20 20:32:09

+0

您最好使用QTimer(http://doc.trolltech.com/3.3/qtimer.html)而不是while循環,並根據需要啓動/停止它。 – Li0liQ 2009-12-20 20:45:15

+0

此外,如果您使用單線程,只要執行while循環,您的停止按鈕將不起作用。所以,正如我所說的,嘗試使用QTimer。 – Li0liQ 2009-12-20 20:47:28

2

你必須讓主事件循環運行,你沒有做的事情。

+0

對不起,我對pyqt很陌生,但是dosent paint調用主循環? – tillsten 2009-12-20 20:32:50

6

你不讓Qt的事件循環運行,所以GUI沒有響應。另外,不需要repaint()QLabel.setText()將重新繪製標籤。它所做的只是排隊一個額外的繪畫事件,但這不會得到處理。

您需要做的是將self.repaint()替換爲QtGui.QApplication.processEvents()。這將使應用程序有機會在循環中處理所有未決事件(包括重繪,以及用戶界面交互)。

+0

謝謝,這應該也工作。 – tillsten 2009-12-21 14:19:46

相關問題