簡體   English   中英

由於帶有按鈕的長循環,如何在pyqt5中停止無響應的主窗口?

[英]How to stop a non-responding mainwindow in pyqt5 due to long loops with a push button?

問題我在 pyqt5 中有一個長時間運行的循環。 運行時,由於長循環,主窗口沒有響應。

我想要什么我想要一個停止按鈕來終止那個循環。 這個按鈕在循環運行時應該仍然處於活動狀態,當我按下它時它會停止循環或終止運行。

我的代碼

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, 60, 75, 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但我不能只是將它與我​​的代碼集成。 感謝你的幫助。 謝謝!

PS 請在一個 .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, 60, 75, 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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM