每当我创建大型zip文件时,PyQt5 GUI都会冻结

问题描述

这是我创建zip文件代码部分。只需更改计算机中真实路径的“ path”变量,它就可以正常工作(“ path”是新zip文件名称和路径)。我可以毫无问题地创建小型目录的zip文件,但是如果尝试使用更大的文件夹,它只会冻结直到完成,否则就会崩溃并关闭。尽管创建了zip文件,所以问题仅在于GUI冻结和崩溃。

from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtWidgets import QApplication,QWidget,QInputDialog,QLineEdit,QFileDialog
import zipfile
import os

class Ui_MainWindow(object):
    def setupUi(self,MainWindow):
        MainWindow.setobjectName("MainWindow")
        MainWindow.resize(800,600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setobjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(200,180,381,101))
        self.pushButton.setobjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,800,26))
        self.menubar.setobjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setobjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

        self.pushButton.clicked.connect(self.createZipFile)

    def retranslateUi(self,MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setwindowTitle(_translate("MainWindow","MainWindow"))
        self.pushButton.setText(_translate("MainWindow","TEST"))

    def createZipFile(self):    
        directoryname = QFileDialog.getExistingDirectory()
        abs_src = os.path.abspath(directoryname)
        with zipfile.ZipFile(path,'w') as my_zip2:
            for folderName,subfolders,filenames in os.walk(directoryname):
                for filename in filenames:
                    absname = os.path.abspath(os.path.join(folderName,filename))
                    arcname = absname[len(abs_src) + 1:]
                    my_zip2.write(absname,arcname)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

解决方法

感谢GPhilo评论,我解决了这个问题。答案基本上是使用线程。我在评论部分链接了我以前用来学习如何使用它们的页面。