我已经开发了一个带有pyside的GUI,并且在按下按钮后执行命令。调用的函数中的第一个命令将在text_terminal中将状态更新为“正在下载...”。第二个命令将启动实际下载(通过Pandas和cx_Oracle执行的SQL查询)。
奇怪的是,text_terminal仅在下载完成后更新。有什么建议可以导致这个?
ui.text_terminal.append("Downloading....")
self.df = dbrs.retrieve(date)
答案 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))