如何使Qt(PyQt)代码按顺序运行?

时间:2015-11-30 07:01:55

标签: python qt pyqt pyside python-3.4


大家好。我在Windows 7上使用PyQt5制作桌面GUI应用程序。

在我的应用程序中,工作量很大。它正在制作指定目录中所有文件的哈希码,如果文件哈希码与ftps文件不相同,则从ftp下载。在我的系统上,这需要大约5-6分钟。

在我的想法中......

  1. 首先显示小部件。 (当然,'self.show()'优先于比较哈希的代码。)

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

  3. 代码正常运行,但在2.结束后显示小部件。这是一个问题 我想我的应用程序首先执行步骤1然后执行步骤2.我该怎么办?

    任何帮助都是apreciated

    代码:

    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_())
    

2 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是在单独的compareHashAndDownload中运行QThread。即使在长时间运行功能完成之前,这也允许小部件与之交互。您也可以稍后重新运行该功能,而不是在那段时间挂起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_())

答案 1 :(得分:0)

您可以直接从compareHashAndDownload窗口小部件中调用showUI。 但是如果你的比较方法花费的时间太长,那么ui会等待它完成,这不是一个很好的体验。所以请记住这一点。

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在单独的线程上运行该方法(不是最优雅的解决方案,但会正常工作)。