我制作了一个 GUI,点击 下载" 按钮后,程序将从 FTP 服务器下载文件.这样做时,我希望标签更新,例如:"Connecting..." ->正在下载..." ->已下载!"我试过用线程模块做,但它似乎不起作用:
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 下载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
为什么我不能插入 Python 列表?Why I cannot make an insert to Python list?(为什么我不能插入 Python 列表?)
在 DataFrame 的开头(最左端)插入一列Insert a column at the beginning (leftmost end) of a DataFrame(在 DataFrame 的开头(最左端)插入一列)
Python psycopg2 没有插入到 postgresql 表中Python psycopg2 not inserting into postgresql table(Python psycopg2 没有插入到 postgresql 表中)
list extend() 索引,不仅将列表元素插入到末尾list extend() to index, inserting list elements not only to the end(list extend() 索引,不仅将列表元素插入到末尾)
如何使用 list.insert 将 Python 中的元素添加到列表How to add element in Python to the end of list using list.insert?(如何使用 list.insert 将 Python 中的元素添加到列表末尾?)
TypeError:“浮动"对象不可下标TypeError: #39;float#39; object is not subscriptable(TypeError:“浮动对象不可下标)