2013-11-29 5 views
1

У меня есть QStackedWidget. В логике (а не в пользовательском интерфейсе) я пытаюсь сменить страницы и ждать там до тех пор, пока не будет нажата кнопка на этой странице (в основном ОК/Отмена). Я передаю пользовательский интерфейс функции в классе.Приостановить выполнение до нажатия кнопки

Что-то вроде этого:

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 

Теперь я знаю, что я не могу порвать с функцией, как то или передать переменное окно через подключение, но я надеюсь, что делает мой пункт достаточно четко.

ответ

2

Простой способ сделать это состоит в обработке ожидающие события внутри цикла (поэтому пользовательский интерфейс остается реагировать), а также включено/отключено внутренний флаг, чтобы управлять запуском и остановкой цикла.

Следующий демонстрационный сценарий показывает базовую реализацию этой идеи:

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

Это великолепно. Абсолютно то, что я искал, большое вам спасибо. – Faller

0

Просто удалите while и break.

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) 
+0

Это не приостанавливает исполнение. – Faller

+0

@Faller, какая часть должна быть приостановлена? 'OK_func'? 'Can_func'? некоторые другие части? – falsetru

+0

Он должен быть приостановлен во время func1 после «setCurrentIndex» до тех пор, пока он не получит вход от OK_func или Can_func – Faller

Смежные вопросы