Импорт модулей в QThread для ускорения запуска - PullRequest
0 голосов
/ 13 июня 2019

Я хочу увеличить скорость запуска моего приложения с графическим интерфейсом.У меня есть два импорта, которые я создал, которые загружаются некоторое время, и мне было интересно, можно ли импортировать их в отдельный QThread и иметь возможность доступа к ним в главном потоке?

class importThreadClass(QtCore.QThread):
    def __init__(self, parent = None):
        super().__init__(parent)
    def run(self):
        from ValveSim import ValveSimulation
        from MetalSizing import MetalSizing

class ZVIApp(QMainWindow, Ui_MainWindow):
####initialize function
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.objectList = []
        self.importThread = importThreadClass()
        self.importThread.finished.connect(self.importThread_Finished)

    def importThread_Finished(self):
        try:
            self.ms = MetalSizing() ### MetalSizing is not defined --this is from MetalSizing import
            self.objectList.append(self.ms)
            self.CreateMetalSizing()
            self.hw.pushButton_3.clicked.connect(self.showms)
        except:
            errorFile = open('{0}\Error.txt'.format(CodeDirectory[-1]), 'a+')
            errorFile.write(traceback.format_exc())
            errorFile.close()

### i'd like for the MetalSizing window to be created as a subwindow not as a separate GUI
    def CreateMetalSizing(self):
        try:
            self.subwindow = QMdiSubWindow()
            self.subwindow.setWidget(self.objectList[0])
            self.mdiArea.addSubWindow(self.subwindow)
            self.objectList[0].tabWidget.setCurrentIndex(0)
            self.subwindow.setMaximumSize(1100, 900)
            self.subwindow.setWindowFlags(QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowSystemMenuHint)
        except:
            errorFile = open('{0}\Error.txt'.format(CodeDirectory[-1]), 'a+')
            errorFile.write(traceback.format_exc())
            errorFile.close()

Я пробовал это на обычном поточном модуле, и он работает, но он создает окна за пределами mdiarea, что, как я полагаю, связано с тем, что его нет в основном потоке.Любые советы или подсказки о том, как я могу это сделать?

1 Ответ

0 голосов
/ 14 июня 2019

Я сделал еще один .py файл, который показывает заставку и импортирует основные программные файлы в фоновом режиме, так как это заставка, не имеет значения, зависает ли он.

import sys,os,time,threading,traceback
from Data import *
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiSubWindow, QAction, QSplashScreen, QProgressBar

def main():
    try:
        app = QApplication(sys.argv)
        splash_pix = QPixmap(imagepath+'\ZVI_Wave.png')
        splash = QSplashScreen(splash_pix, Qt.WindowStaysOnTopHint)
        splash.setMask(splash_pix.mask())
        splash.show()
        app.processEvents()
        from ZVIApp import ZVIApp ###import main program that imports other .py files
        ZVIwindow = ZVIApp()
        ZVIwindow.show()
        os.chdir("C:\\Users\{}\Desktop".format(os.getlogin()))
        splash.close()
        sys.exit(app.exec_())
    except:
        errorFile = open('{0}\CloseErrors.txt'.format(CodeDirectory[-1]), 'a+')
        errorFile.write(traceback.format_exc())
        errorFile.close()

if __name__ == '__main__':
    main()

...