PySide,如何多次休眠而不冻结窗口
我有一个字典的列表,比如说 dict = {'text': 'abcd', 'delay': 1.234}
。我有一个循环,对于列表中的每个字典,都会先等 'delay'
指定的时间,然后再用 'text'
做一些事情:
for element in myList:
time.sleep(element['delay'])
self.ui.textEdit.append(element['text'])
print element['text']
myFunction(element['text'])
在这个过程中,sleep
、print
和 myFunction
都正常工作。但是我的文本编辑器的内容从来没有改变,而且我窗口的标题显示为:'没有响应'。我该如何解决这个问题呢?
2 个回答
1
我想评论一下,但我没有50的声望,所以只能在这里说说了 :p 其实关于pyside和sleep的问题已经在这里问过并且得到了回答,链接是 PySide / wait or sleep :(
3
你的代码正在阻塞Qt的主事件循环。这意味着界面更新的事件被排队了,直到事件循环再次运行,这些事件才会被处理。
一个可能的解决办法是在你向textEdit
添加文本后,调用QtCore.QCoreApplication.processEvents()
,这样可以强制事件循环运行并处理排队的事件。
更通用的解决方案是把你的代码放到一个工作线程中,这样主线程就可以继续处理界面事件。你可以看看我和Shadow9043在这个问题中的回答,获取更多信息。虽然这个问题和你的情况有些不同,但解决方法是类似的(注意示例代码是用PyQt写的,可能和PySide有点不同)。