FTP下载,带有文本标签,显示下载的当前状态 [英] FTP download with text label showing the current status of the download

查看:72
本文介绍了FTP下载,带有文本标签,显示下载的当前状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了一个GUI,在其中单击下载"按钮后,程序将从FTP服务器下载文件.这样做时,我希望标签更新,例如:正在连接..."->正在下载..."->已下载!" 我尝试使用线程模块执行此操作,但似乎不起作用:

I made a GUI in which after I click "Download" button the program will download files from FTP server. When doing that I want the label to update e.g: "Connecting..." -> "Downloading..." -> "Downloaded!" I tried doing it with threading module but it seems to not work:

    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...")似乎返回None,并且出现TypeError ...

It just downloads the file and doesn't change the text label at all. Do I have to use QThread here? I also tried using asyncio but awaiting self.updateStatusText.setText("Connecting...") seems to return None and I get TypeError...

推荐答案

以下代码应执行以下操作:

The following code should do:

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

基于:在多线程PyQT中更新GUI元素.

您的后续问题:从另一个运行FTP下载的线程更新PyQt进度

这篇关于FTP下载,带有文本标签,显示下载的当前状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆