如何让Qt(PyQt)代码有序运行?

How to make Qt(PyQt) codes runs in order?


大家好。我正在 Windows 7.

上使用 PyQt5 制作桌面 GUI 应用程序

在我的申请中,工作量很大。如果文件哈希码与 ftps 文件不相等,它会为指定目录中的所有文件生成哈希码并从 ftp 下载。在我的系统上,这大约需要 5-6 分钟。

在我看来...

  1. 首先显示小部件。 (当然,'self.show()' 在比较散列代码之前。)

  2. 比较哈希码并下载文件。

代码工作正常,但小部件在 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_())