@vadimeasy

Как компилировать 2 и более файла Python в EXE?

Делаю программу для автоматизации в PyQT5, Реализовал скачивание нужнных программ и прогресс барр в новом окне. Грубо-говоря я из основого окна вызываю новую программу которая имеет прогресс бар и кнопку скачать. Проблема в том, что я компилировал с помощью pyinstaller всё в ожин файл. Но при попытке вызова нового окна со скачиванием, программа просто закрывается, в консоли никаких сообщений не появляется.
Функция котоая вызывается из основоного окна:
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import shutil
import glob
import urllib.request
import sys
import threading
import os

url_1 = 'https://download.rutoken.ru/Rutoken/Drivers/Current/rtDrivers.exe'
dlThread = 0
hWindow = 0
fProgressCounter = 0.0

class Form(QWidget):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.resize(300, 100)
        global hWindow
        hWindow = self

        lblUrl = QLabel("Скчать rtDriver.exe?")
        self.bttDL = QPushButton("Скачать")
        self.pbar = QProgressBar()

        self.pbar.setMinimum(0)
        self.pbar.setMaximum(100)

        buttonLayout1 = QVBoxLayout()
        buttonLayout1.addWidget(lblUrl)
        buttonLayout1.addWidget(self.bttDL)
        buttonLayout1.addWidget(self.pbar)

        self.bttDL.clicked.connect(self.bttPush)

        mainLayout = QGridLayout()
        mainLayout.addLayout(buttonLayout1, 0, 1)

        self.setLayout(mainLayout)
        self.setWindowTitle("Скачать Рутокен")
    def bttPush(self):
        global dlThread

        hSignals = sigHandling()
        hSignals.dlProgress_update.connect(hSignals.pbar_incrementer)
        hSignals.dlProgress_done.connect(hSignals.dlDone)

        url = url_1
        filename = 'rtDrivers.exe'
        # filename = filename[:-6]
        # filename = filename.split("('", maxsplit=1)[1]

        # self.bttDL.setEnabled(False)
        dlThread = threading.Thread(target=hSignals.runDL, args=(url, filename))
        dlThread.start()
        return

    def pbarIncValue(self, val):
        global fProgressCounter

        if self.pbar.value() >= 100:
            self.dlProgress_done.emit()
            return
        if fProgressCounter > 1.0:
            self.pbar.setValue(self.pbar.value() + 1)
            fProgressCounter -= 1.0
            fProgressCounter += val
        else:
            fProgressCounter += val

class sigHandling(QObject):
    dlProgress_update = pyqtSignal(float)
    dlProgress_done = pyqtSignal()

    @pyqtSlot(float)
    def pbar_incrementer(self, val):
        hWindow.pbarIncValue(val)

    @pyqtSlot()
    def dlDone(self):
        print("in dlDone")
        hWindow.pbar.setValue(100)
        hWindow.bttDL.setEnabled(True)

    def runDL(self, dlLink, filename):
        #print("in run")
        global dlThread, hWindow
        def report(block_count, block_size, total_size):
            if block_count == 0:
                #print("block_count == 0")
                self.dlProgress_update.emit(0)
            if (block_count * block_size) == total_size:
                self.dlProgress_done.emit()
            incAmount = float((101*block_size) / total_size)
            #print("BS={0} TS={1} incAmount={2}".format(block_size,total_size,incAmount))
            self.dlProgress_update.emit(incAmount)


        urllib.request.urlretrieve(dlLink, filename, reporthook=report)
        #print("emit dlProgress_done")
        self.dlProgress_done.emit()
        #print("about to leave dlThread")
        rt_to_move = glob.glob('rtDrivers.exe')
        desktop_dir = os.path.expanduser("~\\UTM_Set")
        some_file_on_desktop = os.path.join(desktop_dir, 'N')
        for file in rt_to_move:
            shutil.move(file, some_file_on_desktop)
        app.quit()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    screen = Form()
    screen.show()
    sys.exit(app.exec_())

Основное окно:
from subprocess import call
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QLabel
import glob
import shutil

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(348, 405)
        Dialog.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(110, 20, 131, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Dialog)
        self.pushButton_2.setGeometry(QtCore.QRect(110, 70, 131, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(Dialog)
        self.pushButton_3.setGeometry(QtCore.QRect(110, 120, 131, 41))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(Dialog)
        self.pushButton_4.setGeometry(QtCore.QRect(110, 170, 131, 41))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QtWidgets.QPushButton(Dialog)
        self.pushButton_5.setGeometry(QtCore.QRect(110, 220, 131, 41))
        self.pushButton_5.setObjectName("pushButton_5")
        self.pushButton_6 = QtWidgets.QPushButton(Dialog)
        self.pushButton_6.setGeometry(QtCore.QRect(110, 270, 131, 41))
        self.pushButton_6.setObjectName("pushButton_6")
        self.pushButton_7 = QtWidgets.QPushButton(Dialog)
        self.pushButton_7.setGeometry(QtCore.QRect(110, 320, 131, 41))
        self.pushButton_7.setObjectName("pushButton_7")
        self.line = QtWidgets.QFrame(Dialog)
        self.line.setGeometry(QtCore.QRect(10, 210, 331, 16))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.labl = QLabel(Dialog)
        self.labl.setText('abc')
        self.labl.setGeometry(10, 10, 10, 10)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)



        self.download_rt()
        self.download_des()
        self.download_utm()
        self.move_to_config()

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "UTM Настройка"))
        self.pushButton.setText(_translate("Dialog", "Скачать Open VPN"))
        self.pushButton_2.setText(_translate("Dialog", "Скачать Рутокен"))
        self.pushButton_3.setText(_translate("Dialog", "Скачать DXBX Desktop"))
        self.pushButton_4.setText(_translate("Dialog", "Скачать UTM"))
        self.pushButton_5.setText(_translate("Dialog", "Настроить Брандмауэр"))
        self.pushButton_6.setText(_translate("Dialog", "Перезапустить службы"))
        self.pushButton_7.setText(_translate("Dialog", "Config и Transport"))

    # Download rtDriver
    def download_rt(self):
        self.pushButton_2.clicked.connect(self.rutoken_download)

    def rutoken_download(self):
        call(['python', 'rt_download.py'])

    # Download DXBX Deskotop
    def download_des(self):
        self.pushButton_3.clicked.connect(self.desktop_download)

    def desktop_download(self):
        call(['python', 'desktop_download.py'])

#     Download UTM
    def download_utm(self):
        self.pushButton_4.clicked.connect(self.utm_download)

    def utm_download(self):
        call(['python', 'UTM_download.py'])

#     move to trasport and config
    def move_to_config(self):
        self.pushButton_7.clicked.connect(self.trans_conf)

    def trans_conf(self):
        if True:
            transport_to_copy = glob.glob('*.properties')
            destination_trans = (r'C:/UTM/transporter/conf')
            for file in transport_to_copy:
                shutil.copy(file, destination_trans)

        if True:
            ovpn_to_copy = glob.glob('*.ovpn')
            destination = (r'C:/Program Files/OpenVPN/config')
            for file in ovpn_to_copy:
                shutil.copy(file, destination)




if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())


Скажите, почему так может быть. Я подразумеваю что проблема в том, что ещё один цикл выполнения окна вызывается во втором. Если я прав, скажите, где почитать про новые окна в pyqt.
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы