![](/img/trans.png)
[英]How to get value from dialog button to mainwindow tablewidget in 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.