暂停执行直到按下按钮

时间:2013-11-29 16:24:55

标签: python-3.x pyqt pyqt4 wait

我有一个QStackedWidget。在逻辑(不是UI)中,我试图更改页面并在那里等待,直到按下该页面上的按钮(基本上是OK / Cancel)。我将UI传递给了类中的函数。

这样的事情:

def func1(self, window):
    window.stackedWidget.setCurrentIndex(4)
    while True:
        window.btn_OK.clicked.connect(self.OK_func)
        window.btn_Cancel.clicked.connect(self.Can_func)

def OK_func(self, window):
    do_something
    window.stackedWidget.setCurrentIndex(3)
    break

def Can_func(self, window):
    window.stackedWidget.setCurrentIndex(3)
    break

for i in range(5):
    #stuff
    func1(window)  #this is where I want to pause
    #other stuff

现在我知道我不能破坏这样的功能或通过connect传递窗口变量,但我希望这清楚地说明我的观点。

2 个答案:

答案 0 :(得分:3)

执行此操作的一种简单方法是处理循环内的挂起事件(以便UI保持响应),并设置/取消设置内部标志以控制循环的启动和停止。

以下演示脚本显示了这个想法的基本实现:

import time
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.label = QtGui.QLabel(self)
        layout.addWidget(self.label)
        self.buttonStart = QtGui.QPushButton('Start', self)
        self.buttonStart.clicked.connect(self.handleStart)
        layout.addWidget(self.buttonStart)
        self.buttonStop = QtGui.QPushButton('Stop', self)
        self.buttonStop.clicked.connect(self.handleStop)
        layout.addWidget(self.buttonStop)
        self._running = False

    def handleStart(self):
        self.buttonStart.setDisabled(True)
        self._running = True
        while self._running:
            self.label.setText(str(time.clock()))
            QtGui.qApp.processEvents()
            time.sleep(0.05)
        self.buttonStart.setDisabled(False)

    def handleStop(self):
        self._running = False

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 200, 100)
    window.show()
    sys.exit(app.exec_())

答案 1 :(得分:0)

只需删除whilebreak

def func1(self, window):
    window.stackedWidget.setCurrentIndex(4)
    window.btn_OK.clicked.connect(self.OK_func)
    window.btn_Cancel.clicked.connect(self.Can_func)

def OK_func(self, window):
    # do_something
    window.stackedWidget.setCurrentIndex(3)

def Can_func(self, window):
    window.stackedWidget.setCurrentIndex(3)