代码很重,所以我只发布一些片段。
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/