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

PyQt5 GUI freezes whenever I create big zip files

这是我创建 zip 文件的代码部分。只需将“路径”变量更改为计算机中的真实路径,它就可以正常工作(“路径”是新 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, 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 的评论,我解决了这个问题。答案基本上是使用Threads。我在评论部分链接了我用来学习如何使用它们的页面。