MainWindow не обрабатывает события и действия пользователя одновременно - PullRequest
0 голосов
/ 28 мая 2018

У меня есть главное окно PyQt5, которое я создал с помощью Qt Designer.

Это окно должно сканировать сайт и отображать ссылки для сканирования в TreeView, как только они найдены.

Яв состоянии сделать это путем создания модели, QStandardItemModel каждый раз, когда сканируется новая ссылка, добавляются все ссылки на модель, а затем задается модель дерева с TreeView.setModel(model), а затем я вызываю QtWidgets.qApp.processEvents(), поэтомуокно обновлено.В то время как программное обеспечение сканирует сайт, окно не реагирует на взаимодействия с пользователем, пока не будет выполнено QtWidgets.qApp.processEvents().

Как я могу обновить TreeView с помощью последней ссылки для обхода, и при этом мое окно может быть недоступно во время процесса сканирования?

Вот мой код

def start(self):
    ## start crawling
    self.populate_tree(crawled_links)

def populate_tree(self, links):
    data = []
    for index in links:
        item = (links[index]['from'], [])
        for link in links[index]['url']:
            item[1].append((link, []))
        data.append(item)
    model = QtGui.QStandardItemModel()
    self.__add_items(model, data)
    self.treeView.setModel(model)
    self.treeView.expandAll()
    self.treeView.scrollToBottom()
    self.treeView.setHeaderHidden(True)
    QtWidgets.qApp.processEvents()

def __add_items(self, model, data):
    for text, children in data:
        item = QtGui.QStandardItem(text)
        model.appendRow(item)
        if children:
            self.__add_items(item, children)

Если это поможет, список crawled_links выглядит так:

crawled_links = {
0:{
    'url': {
        'one.html',
        'three.html'
        },
    'from':
        'site1.com'
    },
1:{
    'url': {
        'two.html'
        },
    'from':
        'site1.com'
    }
}

1 Ответ

0 голосов
/ 28 мая 2018

Использование processEvents() является плохой практикой, их следует использовать только для определенных специальных задач, и, как вы видите, не решает проблему.

Решение состоит в том, чтобы выполнить задачу в потоке и отправить еесквозные сигналы к потоку GUI.


import threading

from PyQt5 import QtCore, QtWidgets

class Helper(QtCore.QObject):
     resultChanged = QtCore.pyqtSignal(dict)

     def start_crawling(self):
         crawled_links = {}
         # processing
         self.resultChanged.emit(crawled_links)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
     def __init__(self, parent=None)
         QtWidgets.QMainWindow.__init__(self, parent)
         self.setupUi(self)
         self.helper = Helper()
         self.helper.resultChanged.connect(self.populate_tree)

     def start(self):
         # start crawling
         threading.Thread(target=self.helper.start_crawling, daemon=True).start()


     def populate_tree(self, crawled_links)
         ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...