Прервите бесконечность l oop при нажатии кнопки - PullRequest
0 голосов
/ 24 января 2020

Я сейчас использую PyQt5 и создал свой первый GUI. Теперь я хотел бы программу, которая делает следующее. Когда нажата кнопка «Пуск», выполните «функцию» n раз, пока не будет нажата кнопка «Стоп» (представьте секундомер), если я нажму кнопку «Пуск» снова, функция «снова» будет выполнена и т. Д.

То, что я до сих пор пробовал, это следующее, что не может работать, так как мы не можем изменить переменную извне l oop (mockup-script)

class Ui(QtWidgets.QDialog):
def __init__(self):
    super(Ui, self).__init__()
    uic.loadUi('interfaceScan.ui', self)
    self.startScan = self.findChild(QtWidgets.QPushButton, 'startScan') 
    self.startScan.clicked.connect(self.startPressed)

    self.pauseScan = self.findChild(QtWidgets.QPushButton, 'pauseScan')
    self.pauseScan.clicked.connect(self.pausePressed) 

    self.show()

    def startPressed(self):
            global pauseScan
            pauseScan = False 
            dosomething()

    def pausePressed(self):
            global pauseScan
            pausScan = True

def dosomething(): 
    while pauseScan == False: #not needed, but the measurement should be executed periodically until 'pause' is pressed
        print('Running') #in the reals program the measurement will be executed here 
        time.sleep(4) #between each measurement the program needs to wait a cirtain amount of time ~1h  

app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()

Любые идеи о том, как я может решить эту проблему? Теперь я относительно уверен, что он не работает при использовании l oop, поэтому я открыт для предложений о том, как его изменить!

Целью этого скрипта будет управление настройкой измерения это должно работать, скажем, 1000 циклов, но я хотел бы иметь возможность разбить его между ними, чтобы изменить параметры.

1 Ответ

0 голосов
/ 24 января 2020

Как указывает OP в комментариях, в то время как l oop с time.sleep () стремится только выполнить задачу periodi c, но это создает проблему, так как time.sleep () замораживает GUI, вместо этого должен использоваться QTimer:

from PyQt5 import QtCore, QtWidgets, uic


class Ui(QtWidgets.QDialog):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi("interfaceScan.ui", self)
        self.startScan.clicked.connect(self.startPressed)
        self.pauseScan.clicked.connect(self.pausePressed)

        self.timer = QtCore.QTimer(self, interval=4 * 1000, timeout=dosomething)

    @QtCore.pyqtSlot()
    def startPressed(self):
        QtCore.QTimer.singleShot(0, dosomething)
        self.timer.start()

    @QtCore.pyqtSlot()
    def pausePressed(self):
        self.timer.stop()


def dosomething():
    print("Running")


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...