Как правильно совместить фоновые вычисления и диалоги Qt? - PullRequest
0 голосов
/ 01 мая 2020

Я создаю PyQt gui, где я хочу, чтобы, когда пользователь нажимал кнопку:

  • , открывался диалог с файлом, чтобы выбрать файл сохранения
  • , выполняются некоторые вычисления и сохраняется в этом файле

Я хочу, чтобы этот расчет обновил gui через индикатор выполнения. Однако диалоговое окно сохранения файла не закрывается, пока не будет выполнен полный расчет. Я попытался поместить расчет в другой поток с QThread, но он все еще не работает для меня. Вот пример того, как я это сделал:

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QFileDialog, QPushButton,
                             QVBoxLayout, QMessageBox)
from PyQt5.QtCore import QThread
import logging


class calcExport(QThread):

    def __init__(self, path):
        QThread.__init__(self)
        self.path = path

    def __del__(self):
        self.wait()

    def run(self):
        ls = []
        for i in range(10000):
            logging.warning(f"Now on {i}")
            ls.append(i)
        with open(self.path, "w") as f:
            f.write(str(ls))


class Widget(QWidget):

    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.button1 = QPushButton()
        self.button1.setText("File dialog and calculate")
        self.button1.clicked.connect(self.method)
        layout.addWidget(self.button1)

        self.button2 = QPushButton()
        self.button2.setText("Messagebox and calculate")
        self.button2.clicked.connect(self.method2)
        layout.addWidget(self.button2)
        self.setLayout(layout)
        self.show()

    def saveFileBrowser(self):
        path, okpres = QFileDialog.getSaveFileName(caption="Select file")
        if okpres:
            return path

    def method(self):
        # with filedialog
        path = self.saveFileBrowser()
        thread = calcExport(path)
        thread.start()

    def method2(self):
        # with messagebox
        QMessageBox.about(self, "Foo", "Bar")
        path = "./result.txt"
        thread = calcExport(path)
        thread.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec_())

Когда вы нажимаете кнопку 1, открывается диалоговое окно файла, и вы можете выбрать файл. Но он не закрывается, пока l oop не закончится. Нажатие кнопки 2 запустит l oop и только потом покажет сообщение. Вероятно, я неправильно настроил поток. Как получить желаемое поведение:

  • первое диалоговое окно / сообщение показа
  • закрытие диалога
  • запуск расчета и сохранение в фоновом режиме

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...