Запуск 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_())
