在继续运行代码之前等待计时器终止

时间:2014-05-26 10:05:56

标签: python pyside

以下代码在按下START按钮后每秒更新按钮的文本。预期的功能是让代码“等待”,直到计时器停止,然后继续执行代码。也就是说,在按下START后,第二个按钮的文本会增加到3,然后才会在控制台上显示文本I waited!


import sys
from PySide import QtGui, QtCore

class Example(QtGui.QWidget):

    def __init__(self, parent=None):
        super(Example, self).__init__(parent)

        self.app_layout = QtGui.QVBoxLayout()
        self.setLayout(self.app_layout)

        self.setGeometry(300, 300, 50, 50)

        self.current_count = 0

        self.count_to = 4
        self.delay = 1000

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.updateButtonCount) 

        # start button
        start_button = QtGui.QPushButton()
        start_button.setText('START')
        start_button.clicked.connect(self.startCount)
        self.app_layout.addWidget(start_button)

        # number button
        self.number_button = QtGui.QPushButton()
        self.number_button.setText('0')
        self.app_layout.addWidget(self.number_button)



    def updateButtonCount(self):
        self.number_button.setText("%s" % self.current_count)
        self.current_count += 1
        if self.current_count == self.count_to:
            self.timer.stop()


    def startCount(self):
        self.current_count = 0
        self.timer.start(self.delay)

        # this loop hangs the GUI:
        while True:
            if not self.timer.isActive():
                break

        print 'I waited!'


def main():

    app = QtGui.QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

上面的代码挂起了GUI,如果我删除while True:循环,I waited!会立即出现在控制台上。

我确定while True:循环不是正确的方法,所以我正在寻找建议。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是取代

while True:
    if not self.timer.isActive():
        break

while self.timer.isActive():
    QtGui.QApplication.processEvents()

我不确定这是最好的解决方案。