python - PyQt GUI 在 Python 中多线程时卡住,直到线程完成

标签 python multithreading user-interface pyqt4 freeze

代码很重,所以我只发布一些片段。

class Program(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Program, self).__init__(parent)

...

def main():   
    app = QtGui.QApplication(sys.argv)
    global ex
    ex = Program()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

在这两者之间,我有一堆标签、文本字段、按钮和子布局内的 4 个 QListWidgets,这些子布局被添加到网格中。

我根据输入启动可变数量的线程。通常4个线程。它们在自己的类中启动:

class myThread(Thread):
    def __init__(self, arguments, more_arguments):
        threading.Thread.__init__(self)

    def work_it(self, argument, more_arguments):
        Program.some_function_in_Program_class(ex, arguments)

然后我从那里调用 Program() 类中的函数来对 GUI 进行实际更改。

Program.generate_results(ex, arguments, arguments2, more_arguments)

最后它归结为我迭代的列表以及我是打印每个元素还是使用:

my_listbox.addItem(item)

它会卡住 GUI,直到所有 4 个线程都完成遍历列表。然后所有结果一起出现,而不是一个一个出现。

我在 Tkinter 中完成了此操作,我可以看到一个接一个的列表项动态地出现在 ListBox 小部件中,而不会卡住 GUI。

至于管理线程,我正在做的是遍历一个列表,并根据它的长度创建多个线程:

threadlist = []
for i in self.results:
    sub_thread = myThread(i, self.results[i])
    self.threadlist.append(sub_thread)
swapAndWaitThread = spawnAndWaitThreadsThread(self.threadlist)
swapAndWaitThread.start()

我这样做是为了能够管理这 4 个线程并能够知道它们何时完成。

class spawnAndWaitThreadsThread(Thread):
    def __init__(self, threadlist):
        threading.Thread.__init__(self)
        self.threadlist = threadlist

    def run(self):
        for thread in self.threadlist:
            thread.start()

        for thread in self.threadlist:
            thread.join()

    print "threads finished.. do something"

我做错了什么?

最佳答案

我通过在主 Program() 类中添加一个非常简单的函数来解决这个问题,该函数只有一个工作 - 启动一个非常简单的线程,该线程又返回到 Program() 类并调用一个函数,然后开始构造我的线程列表,将它们发送到另一个线程类等。

因此 GUI 不再卡住。

关于python - PyQt GUI 在 Python 中多线程时卡住,直到线程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28591828/

相关文章:

multithreading - cython.parallel : how to initialise thread-local ndarray buffer?

java - 非常大的对象集合的客户端 View 。如何优化?

python - 跨类变量以在 PyQt GUI 中缩放绘图

python - 在 groupby 内分组,然后取平均值

python - 为什么字符 ID 160 在 PDFMiner 中不被识别为 Unicode?

python - 使用函数调用解析算术表达式

python - 单击时如何获取形状的标签

python - 满足条件后继续使用更改的参数进行迭代

c++ - 可移植线程安全的懒惰单例

.net - HttpContext.Current的生命周期是多长?