【发布时间】:2021-03-04 04:20:48
【问题描述】:
我目前正在使用 Qt 中的 UI 在 python 中执行程序。该 UI 包括对一些数据进行编程,并在每 200 毫秒单击一次按钮后发送它们。我的问题是,如果我在主类中执行此操作,程序会完全崩溃(冻结),因此我必须在另一个类或函数中执行此操作。经过一番研究,我遇到了线程,我不知道这是否对我来说是正确的解决方案,但它应该在另一个线程(在后台)中运行我的课程,直到我按下停止按钮而不使我的主窗口崩溃.第二类需要有一个循环,直到我按下停止按钮。
这是我的代码示例:
import Panel
from PyQt5 import QtWidgets, QtCore
import sys
from threading import Thread
import threading
import time
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Panel.Ui_MainWindow()
self.ui.setupUi(self)
self.ui.B_START.clicked.connect(self.StartBtnClicked)
self.ui.B_STOP.clicked.connect(self.StopBtnClicked)
#..
#Other connect and function
#..
def StartBtnClicked(self):
global Startbtn
Startbtn = 1
myClassA()
def StopBtnClicked(self):
global Startbtn
Startbtn = 0
class myClassA(Thread):
def __init__(self):
Thread.__init__(self)
print("myClassA")
self.daemon = True
self.run()
def run(self):
while Startbtn == 1:
print("DONE")
#Doing stuff
time.sleep(0.2)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
以及用于测试它的 UI:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(197, 310)
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
MainWindow.setFont(font)
MainWindow.setStyleSheet("background-color: rgb(252, 252, 252);\n""")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet("")
self.centralwidget.setObjectName("centralwidget")
self.B_START = QtWidgets.QPushButton(self.centralwidget)
self.B_START.setGeometry(QtCore.QRect(50, 50, 71, 61))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.B_START.setFont(font)
self.B_START.setFocusPolicy(QtCore.Qt.ClickFocus)
self.B_START.setStyleSheet("background-color: rgb(65, 218, 78);\n""\n""\n""\n""")
self.B_START.setObjectName("B_START")
self.B_STOP = QtWidgets.QPushButton(self.centralwidget)
self.B_STOP.setGeometry(QtCore.QRect(50, 190, 71, 61))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.B_STOP.setFont(font)
self.B_STOP.setStyleSheet("background-color: rgb(255, 0, 0);")
self.B_STOP.setObjectName("B_STOP")
self.B_SET = QtWidgets.QPushButton(self.centralwidget)
self.B_SET.setGeometry(QtCore.QRect(50, 140, 71, 23))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.B_SET.setFont(font)
self.B_SET.setStyleSheet("background-color: rgb(255,255,255);\n""\n""border-width: 1px;\n""\n""")
self.B_SET.setObjectName("B_SET")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 197, 26))
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.menubar.setFont(font)
self.menubar.setObjectName("menubar")
self.menulk = QtWidgets.QMenu(self.menubar)
font = QtGui.QFont()
font.setPointSize(11)
font.setBold(True)
font.setWeight(75)
self.menulk.setFont(font)
self.menulk.setObjectName("menulk")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menulk.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Panel"))
self.B_START.setText(_translate("MainWindow", "START"))
self.B_STOP.setText(_translate("MainWindow", "STOP"))
self.B_SET.setText(_translate("MainWindow", "SET"))
self.menulk.setTitle(_translate("MainWindow", "TEST"))
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_())
您只需将其放在同一个文件中并将 ui 命名为:“Pannel.py” 我采用的解决方案是好的解决方案吗?如果是,为什么当我按开始时主窗口仍然崩溃。
【问题讨论】:
-
嗨,我已经添加了 UI。有了这个,我想每个人都可以运行程序
-
将
self.run()更改为self.start() -
@eyllanesc 好吧,谢谢你。有时这是我们错过的最简单的事情。它现在正在工作!
标签: python multithreading pyqt5