Есть ли способ заставить qtimer ждать, пока функция не будет выполнена? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть приложение, в котором я хотел бы сделать следующее:

  1. оптимизировать проблему
  2. ждать определенное количество времени, например одну минуту
  3. измерение определенного свойства
  4. повторите шаги два и три несколько раз
  5. начните снова с 1.)

Я хочу начать весь процесс при нажатиина кнопке QPushButton.Необходимо, чтобы этап 2.) начинался только тогда, когда этап 1.) полностью завершен.Я не знаю, сколько времени занимает процесс оптимизации, поэтому я не могу просто использовать QTimer.sleep ().

Я решил эту проблему следующим образом:

from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QDialog
from PyQt5 import QtWidgets
import sys



class MyForm():
    def __init__(self):
        self.ui = QDialog()
        self.button = QtWidgets.QPushButton(self.ui)
        self.button.clicked.connect(self.start_timer)
        self.waiting_interval = 10000
        self.ui.show()

    def start_timer(self):
        self.optimize()
        self.counter = 0
        self.timer = QTimer()
        self.timer.timeout.connect(self.tick)
        self.timer.setSingleShot(True)
        self.timer.start(self.waiting_interval)



    def tick(self):


        self.timer = QTimer()
        if self.counter == 9:
            self.timer.timeout.connect(self.start_timer)
        else:
            self.measure_property()
            self.timer.timeout.connect(self.tick)
        self.timer.setSingleShot(True)
        self.timer.start(self.waiting_interval)
        self.counter += 1


    def optimize(self):
        pass


    def measure_property(self):
        pass



if __name__ == '__main__':
    app = QApplication(sys.argv)
    w=MyForm()
    app.exec_()

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

1 Ответ

0 голосов
/ 28 декабря 2018

Задачи, которые занимают много времени, тяжелы и, как правило, замораживают графический интерфейс, что приводит к плохому восприятию пользователя, в этих случаях эти задачи должны выполняться в другом потоке:

import sys
from PyQt5 import QtCore, QtWidgets


class ProcessThread(QtCore.QThread):
    def run(self):
        while True:
            self.optimize()
            for _ in range(3):
                QtCore.QThread.sleep(60)
                self.measure_property()

    def optimize(self):
        print("optimize")

    def measure_property(self):
        print("measure_property")


class MyForm():
    def __init__(self):
        self.ui = QtWidgets.QDialog()
        self.thread = ProcessThread(self.ui)
        self.button = QtWidgets.QPushButton("Press me")
        self.button.clicked.connect(self.thread.start)
        self.waiting_interval = 10000
        lay = QtWidgets.QVBoxLayout(self.ui)
        lay.addWidget(self.button)
        self.ui.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w=MyForm()
    sys.exit(app.exec_())
...