pyqt5 实现UI界面输入网址,通过uillib库实现抓取图片,存入指定的文件夹,没抓一张图片,进度条就显示前进一步,使用QThread运行耗时程序
时间: 2024-03-23 09:43:04 浏览: 91
好的,这是一个比较复杂的问题,需要分步骤来实现。我来给您讲解一下。
首先,需要安装 PyQt5 和 uillib 库。可以使用 pip 命令安装:
```
pip install PyQt5 uillib
```
接下来,我们需要创建一个 UI 界面,用于输入网址和显示进度条。可以使用 Qt Designer 工具来设计界面,也可以手写代码来创建 UI。这里我使用手写代码的方式来创建 UI。
```python
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QProgressBar
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QThread, pyqtSignal
import urllib.request
class DownloadThread(QThread):
progress_changed = pyqtSignal(int)
def __init__(self, url, path):
super().__init__()
self.url = url
self.path = path
def run(self):
response = urllib.request.urlopen(self.url)
total_length = int(response.getheader('Content-Length'))
downloaded_length = 0
with open(self.path, 'wb') as f:
while True:
chunk = response.read(1024)
if not chunk:
break
f.write(chunk)
downloaded_length += len(chunk)
progress = int(downloaded_length / total_length * 100)
self.progress_changed.emit(progress)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.url_label = QLabel('网址:', self)
self.url_label.move(10, 10)
self.url_edit = QLineEdit(self)
self.url_edit.move(60, 10)
self.url_edit.resize(300, 20)
self.path_label = QLabel('保存路径:', self)
self.path_label.move(10, 40)
self.path_edit = QLineEdit(self)
self.path_edit.move(80, 40)
self.path_edit.resize(280, 20)
self.download_button = QPushButton('下载', self)
self.download_button.move(10, 70)
self.download_button.clicked.connect(self.start_download)
self.progress_bar = QProgressBar(self)
self.progress_bar.move(10, 100)
self.progress_bar.resize(370, 20)
def start_download(self):
url = self.url_edit.text()
path = self.path_edit.text()
self.download_thread = DownloadThread(url, path)
self.download_thread.progress_changed.connect(self.update_progress)
self.download_thread.start()
def update_progress(self, progress):
self.progress_bar.setValue(progress)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
上述代码中,我们创建了一个 `DownloadThread` 类,用于下载图片,并且发送信号更新进度条。 `MainWindow` 类是我们的主窗口,包含输入网址、保存路径、下载按钮和进度条。
在 `start_download` 方法中,我们创建了一个 `DownloadThread` 对象,并且连接了 `progress_changed` 信号,用于更新进度条。然后调用 `start` 方法启动线程。
在 `update_progress` 方法中,我们通过 `setValue` 方法设置进度条的值。
需要注意的是,在下载图片的过程中,我们需要不断地读取数据并写入文件,同时计算已下载的数据占总数据的百分比,从而更新进度条。这个过程是比较耗时的,因此我们使用了 QThread 类来运行这个任务,避免阻塞主线程。
希望这个代码对您有所帮助。
阅读全文