PySide,如何多次休眠而不冻结窗口

-1 投票
2 回答
1830 浏览
提问于 2025-04-18 11:51

我有一个字典的列表,比如说 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'])

在这个过程中,sleepprintmyFunction 都正常工作。但是我的文本编辑器的内容从来没有改变,而且我窗口的标题显示为:'没有响应'。我该如何解决这个问题呢?

2 个回答

1

我想评论一下,但我没有50的声望,所以只能在这里说说了 :p 其实关于pyside和sleep的问题已经在这里问过并且得到了回答,链接是 PySide / wait or sleep :(

3

你的代码正在阻塞Qt的主事件循环。这意味着界面更新的事件被排队了,直到事件循环再次运行,这些事件才会被处理。

一个可能的解决办法是在你向textEdit添加文本后,调用QtCore.QCoreApplication.processEvents(),这样可以强制事件循环运行并处理排队的事件。

更通用的解决方案是把你的代码放到一个工作线程中,这样主线程就可以继续处理界面事件。你可以看看我和Shadow9043在这个问题中的回答,获取更多信息。虽然这个问题和你的情况有些不同,但解决方法是类似的(注意示例代码是用PyQt写的,可能和PySide有点不同)。

撰写回答