我已经用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_())
您应该在for循环中调用QtCore.QCoreApplication.processEvents(),使Qt的事件循环继续处理传入事件(通过键盘或鼠标)
希望我能帮上忙
相关问题 更多 >
编程相关推荐