@Muilton

PyQT5. WebEngineView. Запускаю цикл->открывается 5 пустых форм и потом открываются страницы. Как сделать, чтобы страницы загружались последовательно?

есть MainWindow, заполняется адрес и количество тредов, в цикле эти треды открываются в новых, например 5, окнах.
Сразу открываются все 5 пустых окон, и только потом одновременно начинают стучаться в сеть (т.е. отрабатывает движок webengine) и открывает ок.
А нужно, чтобы они открывались последовательно, т.е. открывается пустышка -> загружается в ней страница, открывается новая пустышка -> загружается страница.

Думал проблема изза синхронности, но оказывается webengine реализован сам асинхроноо.
Пробовал всякие таймеры, треды - ничего не помогло.
Как принудительно запустить webengine?
Мб очередь, приорите?

from PyQt5.QtWidgets import QApplication, QWidget, QGroupBox, QMainWindow, QPushButton, \
    QLabel, QPlainTextEdit, QCheckBox, QMessageBox, QSpinBox, QProgressBar
from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEnginePage, QWebEngineSettings
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QUrl, QTimer, QThread
from PyQt5 import QtNetwork
import random
import sys
import time

class Ui_SecondWindow(object):
    def setupUi(self, MainWindow, link, useragent=None, proxy_address=None):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 500)
        MainWindow.move(10, 10)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.resize(500, 500)
        self.centralwidget.move(0, 0)
        self.centralwidget.setObjectName("centralwidget")

        if proxy_address:
            host, port = proxy_address.split(':')

        self.viewer = QWebEngineView(self.centralwidget)
        self.profile = QWebEngineProfile(self.centralwidget)
        self.webpage = QWebEnginePage(self.profile, self.viewer)

        self.viewer.settings().setAttribute(QWebEngineSettings.PluginsEnabled, True)
        self.viewer.settings().setAttribute(QWebEngineSettings.JavascriptEnabled, True)

        if useragent:
            self.profile.setHttpUserAgent(useragent)

        if proxy_address:
            proxy = QtNetwork.QNetworkProxy()
            proxy.setType(QtNetwork.QNetworkProxy.HttpProxy)
            proxy.setHostName(host)
            proxy.setPort(int(port))
            QtNetwork.QNetworkProxy.setApplicationProxy(proxy)

        self.viewer.setPage(self.webpage)
        self.viewer.load(QUrl(link))
        self.viewer.resize(500, 500)


class MainWindow(QMainWindow):
    def __init__(self):

        super().__init__()
        self.resize(700, 600)
        self.setWindowTitle('View booster')

        self.label_links = QLabel(self)
        self.label_links.move(390, 10)
        self.label_links.resize(181, 16)
        self.label_links.setFont(QFont('Arial', 10))
        self.label_links.setText('Links (video or website)')

        self.text_links = QPlainTextEdit(self)
        self.text_links.move(380, 30)
        self.text_links.resize(301, 151)
        self.text_links.setFont(QFont('Arial', 10))
        self.text_links.setPlainText('2ip.ru')

        self.group_box = QGroupBox(self)
        self.group_box.move(380, 210)
        self.group_box.resize(301, 80)
        self.group_box.setFont(QFont('Arial', 10))
        self.group_box.setTitle('Proxy')

        self.checkbox_proxy = QCheckBox(self.group_box)
        self.checkbox_proxy.move(20, 40)
        self.checkbox_proxy.resize(131, 17)
        self.checkbox_proxy.setFont(QFont('Arial', 10))
        self.checkbox_proxy.setText('Use proxy')

        self.checkbox_os_browser = QCheckBox(self.group_box)
        self.checkbox_os_browser.move(120, 40)
        self.checkbox_os_browser.resize(201, 17)
        self.checkbox_os_browser.setFont(QFont('Arial', 10))
        self.checkbox_os_browser.setText('Use fake OS and Browser')

        self.label_proxylist = QLabel(self)
        self.label_proxylist.move(380, 300)
        self.label_proxylist.resize(181, 16)
        self.label_proxylist.setFont(QFont('Arial', 10))
        self.label_proxylist.setText('List of proxy')

        self.text_proxy = QPlainTextEdit(self)
        self.text_proxy.move(380, 320)
        self.text_proxy.resize(301, 151)
        self.text_proxy.setFont(QFont('Arial', 10))

        self.label_delay = QLabel(self)
        self.label_delay.move(430, 480)
        self.label_delay.resize(71, 21)
        self.label_delay.setFont(QFont('Arial', 10))
        self.label_delay.setText('Delay')

        self.spinbox_delay = QSpinBox(self)
        self.spinbox_delay.move(410, 500)
        self.spinbox_delay.resize(91, 31)
        self.spinbox_delay.setFont(QFont('Arial', 10))

        self.label_threads = QLabel(self)
        self.label_threads.move(580, 480)
        self.label_threads.resize(81, 21)
        self.label_threads.setFont(QFont('Arial', 10))
        self.label_threads.setText('Threads')

        self.spinbox_threads = QSpinBox(self)
        self.spinbox_threads.move(570, 500)
        self.spinbox_threads.resize(81, 31)
        self.spinbox_threads.setFont(QFont('Arial', 10))
        self.spinbox_threads.setMaximum(9999)
        self.spinbox_threads.setValue(2)

        self.label_progressbar = QLabel(self)
        self.label_progressbar.move(140, 530)
        self.label_progressbar.resize(91, 21)
        self.label_progressbar.setFont(QFont('Arial', 10))
        self.label_progressbar.setText('Progress bar')

        self.progressbar = QProgressBar(self)
        self.progressbar.move(10, 550)
        self.progressbar.resize(361, 41)
        self.progressbar.setFont(QFont('Arial', 10))
        self.progressbar.setMaximum(100)

        self.button_start = QPushButton('Start', self)
        self.button_start.move(380, 550)
        self.button_start.resize(131, 41)
        self.button_start.clicked.connect(self.start)

        self.button_stop = QPushButton('Stop', self)
        self.button_stop.move(550, 550)
        self.button_stop.resize(131, 41)
        self.button_stop.clicked.connect(self.close)

        self.browser_widget = QWidget(self)
        self.browser_widget.move(0, 0)
        self.browser_widget.resize(371, 591)

        self.user_agent = QWebEngineView(self.browser_widget)
        self.user_agent.load(QUrl('https://www.ipchicken.com/'))
        self.user_agent.resize(371, 521)
        self.user_agent.setZoomFactor(0.62)
        self.user_agent.show()

        self.counter = []
        self.timer = QTimer()

    def start(self):
        delay = self.spinbox_delay.value()
        threads = self.spinbox_threads.value()
        links = self.text_links.toPlainText().splitlines()

        if self.checkbox_proxy.isChecked():
            proxies = self.text_proxy.toPlainText().splitlines()
            if not proxies:
                QMessageBox.about(self, 'Error', 'Proxy is absent')
                return

        if not links:
            QMessageBox.about(self, 'Error', 'Link(s) is absent')
            return

        for link in links:
            if not link.startswith('http'):
                link = r'https://' + link

            for thread in range(threads):

                if 'proxies' in locals():
                    pr = random.choice(proxies)
                else:
                    pr = None

                br = random.choice(list(BROWSER.values()))
                os = random.choice(list(OS.values()))

                if self.checkbox_os_browser.isChecked():
                    useragent = f"user-agent=Mozilla/5.0 ({os}) {br}"
                else:
                    useragent = None

                self.progressbar.setValue(int((thread + 1) / (threads * len(links)) * 100))

                self.counter.append(QMainWindow())
                self.ui = Ui_SecondWindow()
                self.ui.setupUi(self.counter[-1], link, useragent, pr)
                self.counter[-1].show()

                # QApplication.processEvents()

                # self.timer.startTimer(3000)
                time.sleep(1)

    def stop(self):
        QMessageBox.about(self, 'Stop', f"Process was broken")
        return


if __name__ == '__main__':
    app = QApplication(sys.argv)  # New QApplication
    app.setStyle('Fusion')
    window = MainWindow()  # Create new interface
    window.show()  # show interface
    app.exec_()  # start of application
  • Вопрос задан
  • 129 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы