gpt4 book ai didi

python - MainWindow 不会同时处理事件和用户操作

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:11 25 4
gpt4 key购买 nike

我有一个使用 Qt Designer 制作的 PyQt5 MainWindow。

这个窗口应该抓取网站并在找到后在 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'
}
}

最佳答案

使用 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)
...

关于python - MainWindow 不会同时处理事件和用户操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50566738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com