for-loopを使用してftpサイトから複数のファイルをダウンロードしようとしています。次のコードは、python.exeのシャットダウンウィンドウがポップアップする前に、ループ内の最初の2つのファイルに対してのみ機能するようです。ダウンロードした2つのファイルは完璧ですが、シャットダウン時に3番目にダウンロードされたファイルは空です。私は残りのファイルを手に入れません。どのようなアイデアが問題になるのでしょうか?QtNetwork.QFtp.getのダウンロードが複数のファイルのfor-loopで失敗するのはなぜですか?
from PyQt4 import QtCore, QtGui, QtNetwork
class FtpWindow(QtGui.QDialog):
def __init__(self, parent=None):
self.fileList = QtGui.QTreeWidget()
self.ftp = QtNetwork.QFtp(self)
self.progressDialog = QtGui.QProgressDialog(self)
self.downloadAllButton.clicked.connect(self.downloadAllFile)
self.ftp.commandFinished.connect(self.ftpCommandFinished)
def downloadAllFile(self):
for jj in range(self.fileList.topLevelItemCount()): # how many files in a particular folder
fileName = self.fileList.topLevelItem(jj).text(0)
self.outFile = QtCore.QFile(fileName)
self.ftp.get(fileName, self.outFile) #download one file at a time
self.progressDialog.setLabelText("Downloading %s..." % fileName)
self.progressDialog.exec_()
def ftpCommandFinished(self, _, error):
self.setCursor(QtCore.Qt.ArrowCursor)
if self.ftp.currentCommand() == QtNetwork.QFtp.Get:
if error:
self.statusLabel.setText("Canceled download of %s." % self.outFile.fileName())
self.outFile.close()
self.outFile.remove()
else:
self.statusLabel.setText("Downloaded %s to current directory." % self.outFile.fileName())
self.outFile.close()
self.outFile = None
self.enableDownloadButton()
self.progressDialog.hide()
私は伝えるためにもっとコードが必要です。 'self.progressDialog.exec _()'はブロックモーダルダイアログでなければなりません。 ftp getが非ブロッキングであるように見えるので、ダウンロードがcommandFinished()シグナルを使って終了するまで待たなければなりません。 outFile変数を上書きすると、問題が発生している可能性があります。 http://pyside.github.io/docs/pyside/PySide/QtNetwork/QFtp.html#PySide.QtNetwork.PySide.QtNetwork.QFtp.get – HashSplat
@HashSplat、私は使用します:self.progressDialog = QtGui.QProgressDialog(self) 。 – Curiosity
@HashSplat基本的に、私は[このバージョン](http://stackoverflow.com/questions/1995046/creating-an-ftp-client-with-python)に基づいてすべてのファイルをダウンロードするためのワンクリックを作成しようとしました – Curiosity