Как остановить дополнительный поток нажатием кнопки?
Необходимо помощь в решении следующей проблемы:
На главном окне есть кнопка (pushButton_2), которая должна останавливать дополнительный поток. Но она не работает.
Не могу понять, что я делаю не так. Прошу подсказать как решить данную проблему.
main.py:
import sys
from PySide6.QtWidgets import *
from Controller.Potok_Controller import Potok_Controller
from View.ui_potok import Ui_MainWindow
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.myThread = Potok_Controller()
self.ui.pushButton.clicked.connect(self.open_window)
self.ui.pushButton_2.clicked.connect(self.stop)
def open_window(self):
self.myThread.mysignal.connect(lambda text: self.ui.plainTextEdit.appendPlainText(text))
self.myThread.start()
def stop(self):
self.myThread.stop = False
if __name__ == '__main__':
app = QApplication()
window = MainWindow()
window.show()
sys.exit(app.exec())
ui_potok.py:
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QFrame, QMainWindow, QPlainTextEdit,
QPushButton, QSizePolicy, QVBoxLayout, QWidget)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.frame = QFrame(self.centralwidget)
self.frame.setObjectName(u"frame")
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.verticalLayout_2 = QVBoxLayout(self.frame)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.plainTextEdit = QPlainTextEdit(self.frame)
self.plainTextEdit.setObjectName(u"plainTextEdit")
self.verticalLayout_2.addWidget(self.plainTextEdit)
self.verticalLayout.addWidget(self.frame)
self.frame_2 = QFrame(self.centralwidget)
self.frame_2.setObjectName(u"frame_2")
self.frame_2.setFrameShape(QFrame.StyledPanel)
self.frame_2.setFrameShadow(QFrame.Raised)
self.verticalLayout_3 = QVBoxLayout(self.frame_2)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.pushButton = QPushButton(self.frame_2)
self.pushButton.setObjectName(u"pushButton")
self.verticalLayout_3.addWidget(self.pushButton)
self.pushButton_2 = QPushButton(self.frame_2)
self.pushButton_2.setObjectName(u"pushButton_2")
self.verticalLayout_3.addWidget(self.pushButton_2)
self.verticalLayout.addWidget(self.frame_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Start Thread", None))
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"Stop Thread", None))
# retranslateUi
Код класса где реализован Thread:
import time
from PySide6.QtCore import QThread, Signal
from selenium import webdriver
class Potok_Controller(QThread):
mysignal = Signal(str)
finish_signal = Signal()
def __init__(self, parent=None):
super(Potok_Controller, self).__init__(parent)
self.url = ['https://google.com/', 'https://youtube.com/']
self.stop = True
def txt(self):
while self.stop == True:
for url in self.url:
self.mysignal.emit(f'open {url}')
chrome = webdriver.Chrome(executable_path='chromedriver\\chromedriver.exe')
chrome.get(url=f"{url}")
time.sleep(10)
chrome.close()
chrome.quit()
#chrome.save_screenshot('datadome_regular_webdriver.png')
self.finish_signal.emit()
def run(self):
self.txt()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Если я вас правильно понял, вам надо добавить проверку, например:
if not self.stop:
continue
Да, я немного упорядочил ваш модуль main.py.
Поменяйте импорты и раскомментируйте строки, связанные с webdriver.
main.py
import sys
'''
from PySide6.QtWidgets import *
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
#from Controller.Potok_Controller import Potok_Controller
from q1436700_Potok_Controller import Potok_Controller
#from View.ui_potok import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(400, 300)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(u"verticalLayout")
self.frame = QFrame(self.centralwidget)
self.frame.setObjectName(u"frame")
self.frame.setFrameShape(QFrame.StyledPanel)
self.frame.setFrameShadow(QFrame.Raised)
self.verticalLayout_2 = QVBoxLayout(self.frame)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.plainTextEdit = QPlainTextEdit(self.frame)
self.plainTextEdit.setObjectName(u"plainTextEdit")
self.verticalLayout_2.addWidget(self.plainTextEdit)
self.verticalLayout.addWidget(self.frame)
self.frame_2 = QFrame(self.centralwidget)
self.frame_2.setObjectName(u"frame_2")
self.frame_2.setFrameShape(QFrame.StyledPanel)
self.frame_2.setFrameShadow(QFrame.Raised)
self.verticalLayout_3 = QVBoxLayout(self.frame_2)
self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.pushButton = QPushButton(self.frame_2)
self.pushButton.setObjectName(u"pushButton")
self.verticalLayout_3.addWidget(self.pushButton)
self.pushButton_2 = QPushButton(self.frame_2)
self.pushButton_2.setObjectName(u"pushButton_2")
self.verticalLayout_3.addWidget(self.pushButton_2)
self.verticalLayout.addWidget(self.frame_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Start Thread", None))
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"Stop Thread", None))
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.open_window)
self.pushButton_2.clicked.connect(self.stop)
self.pushButton_2.setEnabled(False)
self.myThread = Potok_Controller()
self.myThread.mysignal.connect(
lambda text: self.plainTextEdit.appendPlainText(text))
self.myThread.finish_signal.connect(lambda: print('finish_signal'))
def open_window(self):
self.myThread.stop = True
self.pushButton.setEnabled(False)
self.pushButton_2.setEnabled(True)
self.myThread.start()
def stop(self):
self.myThread.stop = False
self.pushButton.setEnabled(True)
self.pushButton_2.setEnabled(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
q1436700_Potok_Controller.py
# ???import time
#from selenium import webdriver
'''
from PySide6.QtCore import QThread, Signal # PySide6
'''
from PyQt5 import QtCore, QtGui, QtWidgets # PyQt5
from PyQt5.Qt import * # PyQt5
class Potok_Controller(QThread):
'''
mysignal = Signal(str) # PySide6
finish_signal = Signal() # PySide6
'''
mysignal = pyqtSignal(str) # PyQt5
finish_signal = pyqtSignal() # PyQt5
def __init__(self, parent=None):
super(Potok_Controller, self).__init__(parent)
self.url = ['https://google.com/', 'https://youtube.com/', ]
self.stop = True
def txt(self):
while self.stop == True:
for url in self.url:
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
if not self.stop:
continue
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.mysignal.emit(f'open {url}')
# chrome = webdriver.Chrome(executable_path='chromedriver\\chromedriver.exe')
# chrome.get(url=f"{url}")
# ??? time.sleep(10)
self.msleep(10 * 1000)
# chrome.close()
# chrome.quit()
#chrome.save_screenshot('datadome_regular_webdriver.png')
self.finish_signal.emit()
def run(self):
self.txt()


