【问题标题】:Python Loop Only Works With Print() includedPython 循环仅适用于 Print() 包括
【发布时间】: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


【解决方案1】:

你的主线程因为其他线程没有运行,没有完整代码不知道原因,但是调用QCoreApplication.processEvents()应该可以解决这个问题。

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 2023-02-15
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多