【发布时间】:2015-07-31 12:11:04
【问题描述】:
我有 2 个QListWidget 列表,当从 List1 中选择了某些项目时,正在填充 List2
问题是,在填充 List2 之前,我必须做很多任务,这会使我的 UI 冻结大约 5 秒,这太烦人了,我想让它用 QThread 填充 List2,但它不工作,因为在初始化整个班级之前我我遇到了一个恼人的错误
from ui import Ui_Win
from PyQt4 import QtGui, QtCore
class GenericThread(QtCore.QThread):
def __init__(self, parent=None):
QtCore.QThread.__init__(self, parent)
def __del__(self):
self.quit()
self.wait()
def run(self):
self.emit( QtCore.SIGNAL('itemSelectionChanged()'))
return
class MainUI(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_Win()
self.ui.setupUi(self)
...
genericThread = GenericThread(self)
self.connect(genericThread, QtCore.SIGNAL("itemSelectionChanged()"), self.fill_List2 )
genericThread.start()
def fill_List2(self):
self.ui.List2.clear()
list1SelectedItem = str(self.ui.List1.currentItem().text()) # ERROR HERE
追溯:
# AttributeError: 'NoneType' object has no attribute 'text'
这是因为self.ui.List1.currentItem().text() 是None
为什么在触发itemSelectionChanged 信号之前调用这个函数?
【问题讨论】:
-
不是。您启动线程,该线程立即发出
itemSelectionChanged信号,然后调用fill_List2。你预计会发生什么? -
@ekhumoro 我认为当我单击 List1 中的项目时应该启动线程...我如何修复代码以使其按预期工作?
-
您需要将
List1的itemSelectionChanged连接到创建线程并启动它的插槽。线程完成后,它应该发出一个自定义信号,该信号将返回List2的项目(您不得尝试直接更新工作线程中的 gui)。 -
什么是
from ui import Ui_Win?我不熟悉该导入,因此它使问题非常难以回答。您还没有显示设置或添加列表小部件的代码。我会写一个答案,但如果你能显示ui是什么并添加设置代码,这个问题对未来的用户会更有用。
标签: python multithreading user-interface pyqt