【发布时间】:2015-10-25 02:09:31
【问题描述】:
我目前遇到以下代码问题(使用 PyQt5 的 python 3.4.3):
while not joblist ==[]:
currentitem = joblist.pop()
self.lstthreads.item(threadnum-1).setText("thread" + str(threadnum) + " - " + str(len(joblist)) + " items left to process.")
这个 sn-p 在一个线程中,我首先将一个巨大的文本文件加载到一个列表中,然后将它分成 5 个部分。每个部分都在上面的线程中运行。如您所见,每个循环都会使用 pop() 删除一个项目,并且列表框 (pyqt) 会在 pop() 之后更新列表中剩余的项目总数,以跟踪进度。
但是列表框显示: Thread1 - 0 个项目要处理。 Thread2 - 剩下 0 个项目要处理。 Thread3 - 0 个项目要处理。 Thread4 - 有 0 个项目需要处理。 Thread5 - 0 个项目要处理。
然而,奇怪的是,如果我添加这样的打印语句:
while not joblist ==[]:
print ("trash")
currentitem = joblist.pop()
self.lstthreads.item(threadnum-1).setText("thread" + str(threadnum) + " - " + str(len(joblist)) + " items left to process.")
我得到了我的预期: Thread1 - 有 1396 个项目需要处理。 Thread2 - 有 1396 个项目需要处理。 Thread3 - 有 1396 个项目需要处理。 Thread4 - 有 1396 个项目需要处理。 Thread5 - 有 1396 个项目需要处理。
Listbox 项也按预期更新,这是为什么呢?
【问题讨论】:
-
请关注minimal reproducible example{stackoverflow.com/help/mcve}。你很接近,但我们真的可以使用最小的数据集来为自己重现问题。用眼球修复代码是一个机会。
-
从线程更新列表框是不安全的。您应该只与主线程中的 GUI 对象进行交互。因此,您不能依赖在示例中显示正确信息的列表框。您可能还有另一个问题(
print语句通过减慢线程来解决),但首先通过从您的线程(需要是QThread)向您的主线程发出信号来修复列表框更新,这然后更新列表框(this 答案有一个QThread发出信号的示例)。
标签: python multithreading python-3.x listbox pyqt5