问题描述
我制作了一个 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 进度