我制作了一个GUI,在其中单击“下载”按钮后,程序将从FTP服务器下载文件。这样做时,我希望标签更新,例如:“正在连接…”->“正在下载…”->“已下载!” 我尝试使用线程模块来执行此操作,但它似乎不起作用:
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 …
self.updateStatusText.setText("Connecting...")
以下代码应执行:
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))