PyQt的事件循环通过在QApplication对象上调用.exec_()开始,这个事件循环的线程称为GUI线程——也处理与主机操作系统的所有窗口通信。事件触发的任何执行也将在这个线程中运行,这意味着当PyQt在代码中执行某些操作时,窗口通信和GUI交互将被阻塞。因此,需要用多线程的方式解决出现的视窗卡住的问题。
直接上代码,有2个py文件,一个是PyQt5的视窗部分,一个是主体代码。把视窗部分的代码保存为PyQtTestGUI.py后,可以直接运行主体代码。
一、PyQt5的视窗部分
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1203, 626)
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(11)
MainWindow.setFont(font)
MainWindow.setToolTip("")
MainWindow.setStyleSheet("")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 580, 600))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(11)
self.tabWidget.setFont(font)
self.tabWidget.setObjectName("tabWidget")
self.tab1 = QtWidgets.QWidget()
self.tab1.setObjectName("tab1")
self.tabWidget.addTab(self.tab1, "")
self.tab2 = QtWidgets.QWidget()
self.tab2.setObjectName("tab2")
self.btn_tab1_test2 = QtWidgets.QPushButton(self.tab2)
self.btn_tab1_test2.setGeometry(QtCore.QRect(410, 120, 111, 25))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(9)
self.btn_tab1_test2.setFont(font)
self.btn_tab1_test2.setObjectName("btn_tab1_test2")
self.btn_tab1_test1 = QtWidgets.QPushButton(self.tab2)
self.btn_tab1_test1.setGeometry(QtCore.QRect(380, 60, 168, 33))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.btn_tab1_test1.setFont(font)
self.btn_tab1_test1.setObjectName("btn_tab1_test1")
self.spb_tab1_1 = QtWidgets.QSpinBox(self.tab2)
self.spb_tab1_1.setGeometry(QtCore.QRect(90, 500, 61, 22))
font = QtGui.QFont()
font.setFamily("Arial")
font.setPointSize(10)
self.spb_tab1_1.setFont(font)
self.spb_tab1_1.setProperty("value", 88)
self.spb_tab1_1.setObjectName("spb_tab1_1")
self.cbx_tab1_1 = QtWidgets.QCheckBox(self.tab2)