1

Need help with the following problem:

There is a button on the main window (pushButton_2) that should stop the thread, but it doesn't work, I can't figure out what I'm doing wrong. Please advise how to solve this problem.

Main window code:

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())

Main window rendering code:

# -*- coding: utf-8 -*-

################################################################################
## Form generated from reading UI file 'untitledlFDrVZ.ui'
##
## Created by: Qt User Interface Compiler version 6.3.1
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################

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

Class code where Thread is implemented:

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()
mr.VlaLin
  • 29
  • 2
  • The inner for-loop will keep running until it's finished. The `time.sleep` blocks all code execution. There's nothing you can do to forcibly terminate a thread - calling `thread.quit()`, `thread.terminate()`, etc will have no effect. You need to find a better way to interrupt the code executed inside the inner for-loop (and avoid using `time.sleep`). – ekhumoro Aug 06 '22 at 10:30
  • @ekhumoro could you provide an example? I am having this exact issue. – sammosummo Sep 22 '22 at 16:43
  • @sammosummo Something like [this](https://stackoverflow.com/a/72377470/984421)? – ekhumoro Sep 22 '22 at 20:37

1 Answers1

0

You can use quit() or exit() to exit the thread as mentioned in the documentation.

    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.quit()
viggnah
  • 1,709
  • 1
  • 3
  • 12