FTP 下载带有显示当前下载状态的文本标签
FTP download with text label showing the current status of the download
我制作了一个 GUI,在其中单击 “下载” 按钮后,程序将从 FTP 服务器下载文件。这样做时,我希望标签更新,例如:"Connecting..." -> "Downloading..." -> “已下载!”
我试着用线程模块来做,但它似乎不起作用:
def updater(self):
self.updateStatusText.setText("Status: Connecting...")
thread = threading.Thread(target=self.download)
thread.start()
while thread.isAlive():
self.updateStatusText.setText("Status: Still Downloading...")
def download(self):
ftp = FTP('testdomain.com')
ftp.login(user='username', passwd='password')
ftp.cwd('/main_directory/')
filename = 'testfile.bin'
with open(filename, 'wb') as localfile:
ftp.retrbinary('RETR ' + filename, localfile.write, 1024)
ftp.quit()
localfile.close()
它只是下载文件,根本不改变文本标签。我必须在这里使用 QThread 吗?我也尝试使用 asyncio 但等待 self.updateStatusText.setText("Connecting...")
似乎 return None 并且我得到 TypeError...
应执行以下代码:
class DownloadThread(QtCore.QThread):
data_downloaded = QtCore.pyqtSignal(object)
def run(self):
self.data_downloaded.emit('Connecting...')
ftp = FTP('example.com')
ftp.login(user='user', passwd='password')
ftp.cwd('/main_directory/')
self.data_downloaded.emit('Downloading...')
filename = 'testfile.bin'
with open(filename, 'wb') as localfile:
ftp.retrbinary('RETR ' + filename, localfile.write)
ftp.quit()
self.data_downloaded.emit('Done')
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.label = QtGui.QLabel
self.button = QtGui.QPushButton("Start")
self.button.clicked.connect(self.start_download)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.label)
self.setLayout(layout)
def start_download(self):
self.thread = DownloadThread()
self.thread.data_downloaded.connect(self.on_data_ready)
self.thread.start()
def on_data_ready(self, data):
self.label.setText(unicode(data))
基于:Updating GUI elements in MultiThreaded PyQT.
你的后续问题:
我制作了一个 GUI,在其中单击 “下载” 按钮后,程序将从 FTP 服务器下载文件。这样做时,我希望标签更新,例如:"Connecting..." -> "Downloading..." -> “已下载!” 我试着用线程模块来做,但它似乎不起作用:
def updater(self):
self.updateStatusText.setText("Status: Connecting...")
thread = threading.Thread(target=self.download)
thread.start()
while thread.isAlive():
self.updateStatusText.setText("Status: Still Downloading...")
def download(self):
ftp = FTP('testdomain.com')
ftp.login(user='username', passwd='password')
ftp.cwd('/main_directory/')
filename = 'testfile.bin'
with open(filename, 'wb') as localfile:
ftp.retrbinary('RETR ' + filename, localfile.write, 1024)
ftp.quit()
localfile.close()
它只是下载文件,根本不改变文本标签。我必须在这里使用 QThread 吗?我也尝试使用 asyncio 但等待 self.updateStatusText.setText("Connecting...")
似乎 return None 并且我得到 TypeError...
应执行以下代码:
class DownloadThread(QtCore.QThread):
data_downloaded = QtCore.pyqtSignal(object)
def run(self):
self.data_downloaded.emit('Connecting...')
ftp = FTP('example.com')
ftp.login(user='user', passwd='password')
ftp.cwd('/main_directory/')
self.data_downloaded.emit('Downloading...')
filename = 'testfile.bin'
with open(filename, 'wb') as localfile:
ftp.retrbinary('RETR ' + filename, localfile.write)
ftp.quit()
self.data_downloaded.emit('Done')
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.label = QtGui.QLabel
self.button = QtGui.QPushButton("Start")
self.button.clicked.connect(self.start_download)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.label)
self.setLayout(layout)
def start_download(self):
self.thread = DownloadThread()
self.thread.data_downloaded.connect(self.on_data_ready)
self.thread.start()
def on_data_ready(self, data):
self.label.setText(unicode(data))
基于:Updating GUI elements in MultiThreaded PyQT.
你的后续问题: