代码很重,所以我只发布一些代码片段。
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"
我做错了什么?
答案 0 :(得分:0)
我通过在只有一个作业的主Program()类中添加一个非常简单的函数来解决这个问题 - 启动一个非常简单的线程,然后又回到Program()类并调用那里的函数然后启动构造我的线程列表,将它们发送到另一个线程类等等。
因此,GUI不再冻结。