Запуск scrapy в PyQt5

Делаю программку для запуска scrapy паука из GUI. Запускать научился, а останавливать еще нет.
Смотрел ответ на вопрос и видел только работу с потоками.
Взял один из ответов и подставил в свой код. Паук запустился, но остановить не могу, потому что программа попросту зависает и не отвечает.
Вот код для запуска паука, без использования потоков:

class QThread1(QtCore.QThread):

    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.running = True

    def run(self):
        while self.running:
            try:

                for i in range(0, 100):

                    if self.running is True:
                        print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ' run')
                        time.sleep(1.5)
                    else:

                        print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ' pause')
                        time.sleep(1.5)

            except Exception as err:
                print(err)

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super().__init__()

        self.buttons()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 250, 600, 400)
        self.setWindowTitle('Base parser')

        self.show()

    def buttons(self):

        btn_start = QPushButton('Start', self)
        btn_start.move(15, 30)

        btn_stop = QPushButton('Stop', self)
        btn_stop.move(100, 30)

        btn_start.clicked.connect(self.btn_start_cl)
        btn_stop.clicked.connect(self.btn_stop_cl)

    def btn_start_cl(self):
        self.thread1 = QThread1()
        self.thread1.start(main())

    def btn_stop_cl(self):
        try:
            if self.thread1.running is False:
                self.thread1.running = True

            else:

                self.thread1.running = False
                time.sleep(2)

        except:
            pass


if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

И теперь два волнующих вопроса. Почему зависает программа при запуске? И как можно останавливать парсинг?


Ответы (1 шт):

Автор решения: S. Nick

я отметит строки, в которые внес изменения. Если будет что-то не понятно, напишите. И я конечно не понимаю что такое main().

import sys
import datetime
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *

class QThread1(QtCore.QThread):
    def __init__(self, main, parent=None):                      # + , main
        QtCore.QThread.__init__(self, parent)
        self.main = main                                        # +
        print(f'\n ? main -> {self.main}\n')
        self.running = True

    def run(self):
        while self.running:
            for i in range(0, 100):
                if self.running:                                  # - is True:
                    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ' run')
                else:
                    print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + ' pause')
                    break
                self.msleep(1500)    
        print('Поток завершен - нажали Stop')

    def flag_running(self, flag):                                  # +++
        self.running = flag                                        # +++
        print(f' flag_running -> {self.running}')


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.buttons()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 250, 600, 400)
        self.setWindowTitle('Base parser')

    def buttons(self):
        btn_start = QPushButton('Start', self)
        btn_start.clicked.connect(self.btn_start_cl)
        btn_start.move(15, 30)
        btn_stop = QPushButton('Stop', self)
        btn_stop.move(100, 30)
        btn_stop.clicked.connect(self.btn_stop_cl)

    def btn_start_cl(self):
        main = 'main()'                                           # ???? main() 
        self.thread1 = QThread1(main, self)                       # + (main, self)
#        self.thread1.start(main())
        self.thread1.start()                                      # - main()


    def btn_stop_cl(self):                                         # +++
        self.thread1.flag_running(False)                           # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка