如何修复PyQt5 GUI冻结

2024-04-20 06:03:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用QtDesigner为我的python应用程序创建了一个简单的GUI。当我尝试运行代码时,它工作正常,但我现在的问题是,当我尝试使用GUI上的convert按钮运行代码时,界面冻结或无响应,只有在完成代码执行后才会响应。现在我的问题是如何解决这个问题

这是我的密码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.13.2
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog, QMessageBox

import sys
import excel2img
import openpyxl as xl


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(361, 303)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_exit = QtWidgets.QPushButton(self.centralwidget)
        self.btn_exit.setGeometry(QtCore.QRect(270, 240, 75, 23))
        self.btn_exit.setObjectName("btn_exit")
        self.btn_openfile = QtWidgets.QPushButton(self.centralwidget)
        self.btn_openfile.setGeometry(QtCore.QRect(40, 30, 75, 23))
        self.btn_openfile.setObjectName("btn_openfile")
        self.btn_convert = QtWidgets.QPushButton(self.centralwidget)
        self.btn_convert.setGeometry(QtCore.QRect(40, 60, 75, 23))
        self.btn_convert.setObjectName("btn_convert")
        #self.btn_send = QtWidgets.QPushButton(self.centralwidget)
        #self.btn_send.setGeometry(QtCore.QRect(40, 90, 75, 23))
        #self.btn_send.setObjectName("btn_send")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 361, 21))
        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)

    #Widgets
        self.btn_openfile.clicked.connect(self.openfile)
        self.btn_exit.clicked.connect(self.exit)
        self.btn_convert.clicked.connect(self.convert)
    #Widgets

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_exit.setText(_translate("MainWindow", "Exit"))
        self.btn_openfile.setText(_translate("MainWindow", "Open File"))
        self.btn_convert.setText(_translate("MainWindow", "Convert File"))
        #self.btn_send.setText(_translate("MainWindow", "Send Payroll"))

    #My Functons

    fileName = ''
    @classmethod
    def openfile(cls):
        fname = QFileDialog.getOpenFileName(None, "Open File", "", "Excel files (*.xlsx *xls)")
        cls.fileName = fname[0]

    def exit(self):      
        quit_msg = "Are you sure you want to exit the program?"
        reply = QMessageBox.question(None, 'Prompt', 
                         quit_msg, QMessageBox.Yes | QMessageBox.No)

        if reply == QMessageBox.Yes:
            sys.exit()

    def convert(self):
        wb = xl.load_workbook(self.fileName, read_only=True)
        ws = wb.active
        a, b = 2, 2
        x, y = 1, 44
        z, w = 1, 44

        max_row = ws.max_row
        temp = 0
        loop_num = 0
        while temp < max_row:
            temp += 52
            loop_num += 1

        print(loop_num)

        for i in range(loop_num * 2):
            if i % 2 == 0:
                cell = "Sheet1!A{}:F{}".format(x,y)
                ccell = 'B{}'.format(a)
                var = ws[ccell].value
                a += 52
                x += 52
                y += 52

            else:
                cell = "Sheet1!H{}:M{}".format(z,w)
                ccell = 'I{}'.format(b)
                var = ws[ccell].value       
                b += 52
                z += 52
                w += 52

            name = '{}.png'.format(var)
            excel2img.export_img(self.fileName, name, "", cell )

            print('generating image {}'.format(i + 1))




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_())

Tags: importselfformatconvertsysexittranslatebtn
1条回答
网友
1楼 · 发布于 2024-04-20 06:03:10

您应该在for循环中调用QtCore.QCoreApplication.processEvents(),使Qt的事件循环继续处理传入事件(通过键盘或鼠标)

希望我能帮上忙

相关问题 更多 >