由于使用按钮的长循环,如何在pyqt5中停止无响应的主窗口?

问题描述

问题我在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) 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...