<p>直接的问题是<code>Ui_MainWindow</code>是一个类,而不是该类的实例。您必须将您的“窗口”<code>self</code>传递给<code>DownloadThread</code>。但无论如何,这不是正确的解决办法。不能从另一个线程访问PyQt小部件。相反,使用与您已经做过的相同的技术来更新状态文本(<em><a href="https://stackoverflow.com/q/57603694/850848">FTP download with text label showing the current status of the download</a></em>)。在</p>
<pre><code>class Ui_MainWindow(object):
def download_file(self):
self.thread = DownloadThread()
self.thread.data_downloaded.connect(self.on_data_ready)
self.thread.data_progress.connect(self.on_progress_ready)
self.progress_initialized = False
self.thread.start()
def on_progress_ready(self, data):
# The first signal sets the maximum, the other signals increase a progress
if self.progress_initialized:
self.progressBar.setValue(self.progressBar.value() + int(data))
else:
self.progressBar.setMaximum(int(data))
self.progress_initialized = True
class DownloadThread(QtCore.QThread):
data_downloaded = QtCore.pyqtSignal(object)
data_progress = QtCore.pyqtSignal(object)
def run(self):
self.data_downloaded.emit('Status: Connecting...')
with FTP('example.com') as ftp:
ftp.login(user='user', passwd='pass')
ftp.cwd('/some_directory/')
filename = '100MB.bin'
totalsize = ftp.size(filename)
print(totalsize)
# The first signal sets the maximum
self.data_progress.emit(str(totalsize))
self.data_downloaded.emit('Status: Downloading...')
with open(filename, 'wb') as self.localfile:
ftp.retrbinary('RETR ' + filename, self.file_write)
self.data_downloaded.emit('Status: Updated!')
def file_write(self, data):
self.localfile.write(data)
# The other signals increase a progress
self.data_progress.emit(str(len(data)))
</code></pre>
<p>对代码的其他更改:</p>
<ul>
<li><code>global localfile</code>是一种不好的做法。请改用<code>self.localfile</code>。在</li>
<li>不需要<code>localfile.close()</code>,<code>with</code>来处理。在</li>
<li>类似地,<code>ftp.quit()</code>应替换为<code>with</code>。在</li>
<li>不需要<code>DownloadThread</code>从<code>Ui_MainWindow</code>继承。在</li>
</ul>