如何让Qt(PyQt)代码有序运行?
How to make Qt(PyQt) codes runs in order?
大家好。我正在 Windows 7.
上使用 PyQt5 制作桌面 GUI 应用程序
在我的申请中,工作量很大。如果文件哈希码与 ftps 文件不相等,它会为指定目录中的所有文件生成哈希码并从 ftp 下载。在我的系统上,这大约需要 5-6 分钟。
在我看来...
首先显示小部件。 (当然,'self.show()' 在比较散列代码之前。)
比较哈希码并下载文件。
代码工作正常,但小部件在 2.
结束后显示。这是一个问题。
我想让我的应用程序先运行第 1 步,然后再运行第 2 步。我应该怎么做?
感谢任何帮助
代码:
class showUI(QWidget):
# make menu, toolbar, buttons, etc..
self.show()
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
mainProcess = compareHashAndDownload()
sys.exit(app.exec_())
您可以直接从 showUI
小部件本身调用 compareHashAndDownload
。
但是,如果您的比较方法花费的时间太长,那么 ui 将等待它完成,这不是一个很好的选择 experience.So 请记住这一点。
class showUI(QWidget):
# make menu, toolbar, buttons, etc..
mainProcess = compareHashAndDownload()
self.show()
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
sys.exit(app.exec_())
如果该方法不会花费那么长的时间,这会很好地工作,如果确实如此,则使用 qt 自己的 QThread
到 运行 单独线程上的方法(不是最优雅的解决方案,但会很好地工作).
解决此问题的最佳方法是将 运行 compareHashAndDownload
放在单独的 QThread
中。这也将允许与小部件进行交互,甚至在 long 运行ning 函数完成之前。您也可以稍后重新运行该功能,而不是在那个时候挂断 GUI。
使用线程非常复杂。例如,您需要安排 GUI 操作,以便它们在 compareHashAndDownload
函数执行之前、期间或之后调用时正确运行。
有一些很好的示例 here 如果您决定走这条路,它们会对您有所帮助。
但是,一个便宜又令人愉快的替代方法是显示启动画面
当您执行 compareHashAndDownload
时。这是一个简单的例子:
class showUI(QWidget):
splash = QtGui.QSplashScreen(QtGui.QPixmap(splashFileName))
splash.show()
# make menu, toolbar, buttons, etc..
mainProcess = compareHashAndDownload()
self.show()
splash.finish(self)
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
sys.exit(app.exec_())
大家好。我正在 Windows 7.
上使用 PyQt5 制作桌面 GUI 应用程序在我的申请中,工作量很大。如果文件哈希码与 ftps 文件不相等,它会为指定目录中的所有文件生成哈希码并从 ftp 下载。在我的系统上,这大约需要 5-6 分钟。
在我看来...
首先显示小部件。 (当然,'self.show()' 在比较散列代码之前。)
比较哈希码并下载文件。
代码工作正常,但小部件在 2.
结束后显示。这是一个问题。
我想让我的应用程序先运行第 1 步,然后再运行第 2 步。我应该怎么做?
感谢任何帮助
代码:
class showUI(QWidget):
# make menu, toolbar, buttons, etc..
self.show()
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
mainProcess = compareHashAndDownload()
sys.exit(app.exec_())
您可以直接从 showUI
小部件本身调用 compareHashAndDownload
。
但是,如果您的比较方法花费的时间太长,那么 ui 将等待它完成,这不是一个很好的选择 experience.So 请记住这一点。
class showUI(QWidget):
# make menu, toolbar, buttons, etc..
mainProcess = compareHashAndDownload()
self.show()
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
sys.exit(app.exec_())
如果该方法不会花费那么长的时间,这会很好地工作,如果确实如此,则使用 qt 自己的 QThread
到 运行 单独线程上的方法(不是最优雅的解决方案,但会很好地工作).
解决此问题的最佳方法是将 运行 compareHashAndDownload
放在单独的 QThread
中。这也将允许与小部件进行交互,甚至在 long 运行ning 函数完成之前。您也可以稍后重新运行该功能,而不是在那个时候挂断 GUI。
使用线程非常复杂。例如,您需要安排 GUI 操作,以便它们在 compareHashAndDownload
函数执行之前、期间或之后调用时正确运行。
有一些很好的示例 here 如果您决定走这条路,它们会对您有所帮助。
但是,一个便宜又令人愉快的替代方法是显示启动画面
当您执行 compareHashAndDownload
时。这是一个简单的例子:
class showUI(QWidget):
splash = QtGui.QSplashScreen(QtGui.QPixmap(splashFileName))
splash.show()
# make menu, toolbar, buttons, etc..
mainProcess = compareHashAndDownload()
self.show()
splash.finish(self)
class compareHashAndDownload:
# compare hash and download the files.
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = showUI()
sys.exit(app.exec_())