3

下面的程序应该只是计数和 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_())   

有什么帮助吗?

4

3 回答 3

7

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

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

于 2009-12-21T00:49:20.537 回答
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 循环来实现您正在实施的行为。

于 2009-12-20T20:21:20.207 回答
2

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

于 2009-12-20T20:25:54.430 回答