Я создаю 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 и только потом покажет сообщение. Вероятно, я неправильно настроил поток. Как получить желаемое поведение:
- первое диалоговое окно / сообщение показа
- закрытие диалога
- запуск расчета и сохранение в фоновом режиме
Большое спасибо