PyQt GUI冻结,直到线程完成,同时在Python中进行多线程处理

时间:2015-02-18 19:06:20

标签: 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"

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

因此,GUI不再冻结。