PyQt 4 UI冻结

时间:2009-12-20 20:15:41

标签: python qt pyqt pyqt4

以下程序应该只计数和int并在标签中显示其值。 但过了一段时间,GUI停止工作,而循环连续。

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

任何帮助?

3 个答案:

答案 0 :(得分:6)

你不会让Qt的事件循环运行,因此GUI没有响应。此外,不需要repaint()QLabel.setText()将重新标记标签。它所做的只是排队一个额外的绘制事件,但这永远不会得到处理。

您需要做的是将self.repaint()替换为 QtGui.QApplication.processEvents() 。这将使应用程序有机会在您进入循环时处理任何待处理事件(包括重绘,以及ui交互)。

答案 1 :(得分: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重新绘制。

更新。:对于您正在实施的行为,您应该使用QTimer而不是简单的while循环。

答案 2 :(得分:2)

你必须让主事件循环运行,这是你没有做的事情。