意外的执行顺序 - GUI仅在下载完成后更新

时间:2016-06-10 13:17:15

标签: python qt user-interface pyside

我已经开发了一个带有pyside的GUI,并且在按下按钮后执行命令。调用的函数中的第一个命令将在text_terminal中将状态更新为“正在下载...”。第二个命令将启动实际下载(通过Pandas和cx_Oracle执行的SQL查询)。

奇怪的是,text_terminal仅在下载完成后更新。有什么建议可以导致这个?

ui.text_terminal.append("Downloading....")
self.df = dbrs.retrieve(date)

1 个答案:

答案 0 :(得分:2)

在处理重绘事件之前,GUI不会更新。这些通常在事件循环开始时完成。如果你的应用程序忙于运行python代码,它将不会进入事件循环的下一个循环,直到代码完成运行。正确的方法是将长时间运行的操作推送到一个单独的线程中,这样它就不会占用主GUI线程,并且事件循环可以继续处理GUI更新事件,但是有很多方法可以解决它。

您可以简单地告诉应用程序处理重绘事件。

ui.text_terminal.append("Downloading....")
QtGui.QApplication.processEvents()
self.df = dbrs.retrieve(date)

retrieve函数之前调用它,它应该强制更新GUI。

另一种方法是简单地将操作推送到下一个事件循环周期,这意味着在执行之前至少会有一次重绘。您可以使用单一QTimer进行此操作。这会破坏你的功能流,所以只有你在下载后没有做任何事情才真正有意义。

def do_retrieve(self, date):
    self.df = dbrs.retrieve(date)

ui.text_terminal.append("Downloading....")
QtCore.QTimer.singleShot(1, lambda: self.do_retrieve(date))