问题描述
问题我在pyqt5中运行了很长时间。在运行时,主窗口由于长时间循环而没有响应。
我想要的我想要一个STOP按钮来终止该循环。在循环运行时,当我按该按钮将停止循环或终止运行时,该按钮仍应处于活动状态。
我的代码
from PyQt5 import QtCore,QtGui,QtWidgets
class Ui_MainWindow(object):
def print_this(self):
to_loop = 10000000
for n in range(to_loop):
print(n)
def setupUi(self,MainWindow):
MainWindow.setobjectName("MainWindow")
MainWindow.resize(329,205)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setobjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(70,60,75,23))
self.pushButton.setText('Start Loop')
self.pushButton.clicked.connect(self.print_this)
self.pushButton.show()
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(170,23))
self.pushButton_2.setText('Stop')
self.pushButton_2.show()
MainWindow.setCentralWidget(self.centralwidget)
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_())
我的尝试我相信这与multiprocessing,qthread,qprocess
有关,但是我不能仅仅将其与我的代码集成。感谢你的帮助。谢谢!
P.S请以一种.py解决方案作为响应,因为我在实际工作中有很多代码。谢谢!
解决方法
您根本不需要使用QThreads,而是需要使用QProcess。您可以使用“停止”按钮杀死QProcess,并使用“启动循环”按钮启动其他QProcess,这使您可以在循环运行时使用GUI。如果您需要查看脚本的输出,我还添加了打印功能。
from PyQt5 import QtCore,QtGui,QtWidgets
import sys
#path of your for loop script
user_script = "insert your loop path"
class Ui_MainWindow(QtCore.QObject):
def setupUi(self,MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(329,205)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(70,60,75,23))
self.pushButton.setText('Start Loop')
self.pushButton.clicked.connect(self.start_loop)
self.pushButton.show()
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(170,23))
self.pushButton_2.setText('Stop')
#stop loop when push button
self.pushButton_2.clicked.connect(self.stop_loop)
self.pushButton_2.show()
MainWindow.setCentralWidget(self.centralwidget)
#create process
self.process = QtCore.QProcess()
self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
def start_loop(self):
self.process.start("python",["-u",user_script])
def stop_loop(self):
self.process.kill()
#this prints the output
output = self.process.readAll()
output = str(output.data(),encoding = "utf-8")
print(output)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
您的“ user_script”是具有以下循环的简单Python脚本:
to_loop = 1000000
for n in range(to_loop):
print(n)