以下程序应该只计数和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_())
任何帮助?
答案 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)
你必须让主事件循环运行,这是你没有做的事情。