PyQt 堆叠小部件在函数结束之前不会移动到下一页
PyQt stacked widget not moving to next page until function ends
你好我有一个程序,当按下一个按钮时它应该移动到下一个堆叠的小部件替换一些标签中的一些文本然后执行一些功能但是这不起作用并在功能完成时移动到下一页
代码是:
QtCore.QObject.connect(self.StartBtn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.start) #Start
def nextPage(self):
current_page = self.stackedWidget.currentIndex()
i = int(current_page) + 1
self.stackedWidget.setCurrentIndex(i)
def start(self):
self.nextPage()
self.animation()
self.runFunctions()
def runFunctions(self):
try:
self.DbLabel.setText(_translate("MainWindow", "Checking Database", None))
if checkDb == True:
self.DbLabel.setText(_translate("MainWindow", "Checking Database ", None))
self.checkDbFun()
self.DbLabel.setText(_translate("MainWindow", "Database checked", None))
else:
self.checkedDbImg.setPixmap(QtGui.QPixmap(_fromUtf8("Files\x.png")))
self.DbLabel.setText(_translate("MainWindow", "Database not checked", None))
except Exception as e:
self.AlertMessage(e)
def animation(self):
self.LoadingGif = QtGui.QLabel(MainWindow)
movie = QtGui.QMovie("Files\loading.png")
self.LoadingGif.setMovie(movie)
self.LoadingGif.setAlignment(QtCore.Qt.AlignCenter)
self.gridLayout_2.addWidget(self.LoadingGif, 4, 1, 1, 1)
movie.start()
所以我想要的是按 StartBtn,然后移至下一个堆叠小部件页面加载动画图像,然后 运行 函数
您可能需要让 Qt 处理事件以使选项卡更改生效。您可以通过两种方式做到这一点:
- 在
animation()
和runFunctions()
之间插入一个qApp.processEvents()
(qApp
在PyQt5.QtWidgets
中)
- 通过 single-shot 计时器调用
runFunctions()
:QTimer.singleShot(0, runFunctions)
,它将通过事件循环安排 runFunctions
,因此将首先处理任何未决事件(因为 runFunctions()
是最新添加的),那么 runFunctions()
将被调用。如果您确实有 runFunctions()
的参数,请使用 lambda。
我赞成第一种方法,因为我发现它更清楚地表明正在发生的事情(需要处理的事件),但我还建议在 "so stack tab can change" 这一行添加注释。
顺便说一句,您应该对 signals-slot 连接使用 new-style 表示法,更简洁,形式为 "signal.connect(slot)":
self.StartBtn.clicked.connect(self.start)
因此对于方法 #1,您的代码将如下所示:
from PyQt5.QtWidgets import qApp
...
self.StartBtn.clicked.connect(self.start)
...
def start(self):
self.nextPage()
self.animation()
qApp.processEvents()
self.runFunctions()
...
你好我有一个程序,当按下一个按钮时它应该移动到下一个堆叠的小部件替换一些标签中的一些文本然后执行一些功能但是这不起作用并在功能完成时移动到下一页 代码是:
QtCore.QObject.connect(self.StartBtn, QtCore.SIGNAL(_fromUtf8("clicked()")), self.start) #Start
def nextPage(self):
current_page = self.stackedWidget.currentIndex()
i = int(current_page) + 1
self.stackedWidget.setCurrentIndex(i)
def start(self):
self.nextPage()
self.animation()
self.runFunctions()
def runFunctions(self):
try:
self.DbLabel.setText(_translate("MainWindow", "Checking Database", None))
if checkDb == True:
self.DbLabel.setText(_translate("MainWindow", "Checking Database ", None))
self.checkDbFun()
self.DbLabel.setText(_translate("MainWindow", "Database checked", None))
else:
self.checkedDbImg.setPixmap(QtGui.QPixmap(_fromUtf8("Files\x.png")))
self.DbLabel.setText(_translate("MainWindow", "Database not checked", None))
except Exception as e:
self.AlertMessage(e)
def animation(self):
self.LoadingGif = QtGui.QLabel(MainWindow)
movie = QtGui.QMovie("Files\loading.png")
self.LoadingGif.setMovie(movie)
self.LoadingGif.setAlignment(QtCore.Qt.AlignCenter)
self.gridLayout_2.addWidget(self.LoadingGif, 4, 1, 1, 1)
movie.start()
所以我想要的是按 StartBtn,然后移至下一个堆叠小部件页面加载动画图像,然后 运行 函数
您可能需要让 Qt 处理事件以使选项卡更改生效。您可以通过两种方式做到这一点:
- 在
animation()
和runFunctions()
之间插入一个qApp.processEvents()
(qApp
在PyQt5.QtWidgets
中) - 通过 single-shot 计时器调用
runFunctions()
:QTimer.singleShot(0, runFunctions)
,它将通过事件循环安排runFunctions
,因此将首先处理任何未决事件(因为runFunctions()
是最新添加的),那么runFunctions()
将被调用。如果您确实有runFunctions()
的参数,请使用 lambda。
我赞成第一种方法,因为我发现它更清楚地表明正在发生的事情(需要处理的事件),但我还建议在 "so stack tab can change" 这一行添加注释。
顺便说一句,您应该对 signals-slot 连接使用 new-style 表示法,更简洁,形式为 "signal.connect(slot)":
self.StartBtn.clicked.connect(self.start)
因此对于方法 #1,您的代码将如下所示:
from PyQt5.QtWidgets import qApp
...
self.StartBtn.clicked.connect(self.start)
...
def start(self):
self.nextPage()
self.animation()
qApp.processEvents()
self.runFunctions()
...