# PyQt5如何實現百度圖片下載器GUI界面
## 一、前言
在當今互聯網時代,圖片資源的獲取和下載已成為許多用戶的日常需求。百度圖片作為國內最大的圖片搜索引擎之一,提供了海量的圖片資源。本文將詳細介紹如何使用Python的PyQt5庫構建一個功能完善的百度圖片下載器GUI界面,幫助用戶快速批量下載所需圖片。
## 二、環境準備
### 1. 安裝必要庫
```bash
pip install PyQt5 requests beautifulsoup4 lxml
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QLabel, QLineEdit, QPushButton,
QListWidget, QProgressBar, QMessageBox)
class ImageDownloaderGUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("百度圖片下載器")
self.setGeometry(300, 300, 800, 600)
# 主控件
self.main_widget = QWidget()
self.setCentralWidget(self.main_widget)
# 主布局
self.main_layout = QVBoxLayout()
self.main_widget.setLayout(self.main_layout)
self._setup_ui()
def _setup_ui(self):
"""初始化UI界面"""
# 搜索區域
self._create_search_area()
# 結果顯示區域
self._create_result_area()
# 下載控制區域
self._create_control_area()
def _create_search_area(self):
"""創建搜索區域"""
search_layout = QHBoxLayout()
# 搜索關鍵詞輸入框
self.keyword_input = QLineEdit()
self.keyword_input.setPlaceholderText("請輸入搜索關鍵詞...")
# 搜索按鈕
self.search_btn = QPushButton("搜索")
self.search_btn.setFixedWidth(80)
search_layout.addWidget(self.keyword_input)
search_layout.addWidget(self.search_btn)
self.main_layout.addLayout(search_layout)
def _create_result_area(self):
"""創建圖片結果顯示區域"""
result_layout = QVBoxLayout()
# 圖片列表
self.image_list = QListWidget()
self.image_list.setViewMode(QListWidget.IconMode)
self.image_list.setResizeMode(QListWidget.Adjust)
self.image_list.setIconSize(QSize(150, 150))
self.image_list.setSpacing(10)
result_layout.addWidget(QLabel("搜索結果:"))
result_layout.addWidget(self.image_list)
self.main_layout.addLayout(result_layout)
def _create_control_area(self):
"""創建下載控制區域"""
control_layout = QHBoxLayout()
# 下載路徑選擇
self.path_btn = QPushButton("選擇保存路徑")
self.path_label = QLabel("未選擇路徑")
# 下載按鈕
self.download_btn = QPushButton("開始下載")
self.download_btn.setEnabled(False)
# 進度條
self.progress_bar = QProgressBar()
self.progress_bar.setVisible(False)
control_layout.addWidget(self.path_btn)
control_layout.addWidget(self.path_label)
control_layout.addWidget(self.download_btn)
self.main_layout.addLayout(control_layout)
self.main_layout.addWidget(self.progress_bar)
import requests
from bs4 import BeautifulSoup
from urllib.parse import quote
class BaiduImageDownloader:
@staticmethod
def search_images(keyword, page=1):
"""搜索百度圖片"""
url = f"https://image.baidu.com/search/flip?tn=baiduimage&word={quote(keyword)}&pn={(page-1)*20}"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
# 解析圖片URL
img_tags = soup.find_all('img', {'class': 'main_img'})
return [img['src'] for img in img_tags if img.get('src')]
except Exception as e:
print(f"搜索失敗: {e}")
return []
import os
from PyQt5.QtCore import QThread, pyqtSignal
class DownloadThread(QThread):
progress_signal = pyqtSignal(int)
finished_signal = pyqtSignal(bool, str)
def __init__(self, urls, save_dir):
super().__init__()
self.urls = urls
self.save_dir = save_dir
def run(self):
try:
if not os.path.exists(self.save_dir):
os.makedirs(self.save_dir)
total = len(self.urls)
for i, url in enumerate(self.urls):
try:
response = requests.get(url, stream=True, timeout=10)
if response.status_code == 200:
# 保存圖片
ext = url.split('.')[-1][:4]
filename = f"{i+1}.{ext}"
path = os.path.join(self.save_dir, filename)
with open(path, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
except Exception as e:
print(f"下載失敗: {url} - {e}")
# 更新進度
progress = int((i+1)/total*100)
self.progress_signal.emit(progress)
self.finished_signal.emit(True, "下載完成")
except Exception as e:
self.finished_signal.emit(False, str(e))
def _connect_signals(self):
"""連接信號與槽"""
# 搜索按鈕點擊
self.search_btn.clicked.connect(self._on_search)
# 路徑選擇按鈕
self.path_btn.clicked.connect(self._select_save_path)
# 下載按鈕點擊
self.download_btn.clicked.connect(self._start_download)
def _on_search(self):
"""處理搜索事件"""
keyword = self.keyword_input.text().strip()
if not keyword:
QMessageBox.warning(self, "警告", "請輸入搜索關鍵詞!")
return
# 清空之前的結果
self.image_list.clear()
self.image_urls = []
# 顯示加載狀態
self.search_btn.setEnabled(False)
self.search_btn.setText("搜索中...")
# 使用線程執行搜索
self.search_thread = SearchThread(keyword)
self.search_thread.result_signal.connect(self._handle_search_result)
self.search_thread.start()
class SearchThread(QThread):
result_signal = pyqtSignal(list)
def __init__(self, keyword):
super().__init__()
self.keyword = keyword
def run(self):
urls = BaiduImageDownloader.search_images(self.keyword)
self.result_signal.emit(urls)
def _start_download(self):
"""開始下載圖片"""
if not hasattr(self, 'save_path') or not self.save_path:
QMessageBox.warning(self, "警告", "請先選擇保存路徑!")
return
if not hasattr(self, 'image_urls') or not self.image_urls:
QMessageBox.warning(self, "警告", "沒有可下載的圖片!")
return
# 設置UI狀態
self.download_btn.setEnabled(False)
self.progress_bar.setVisible(True)
self.progress_bar.setValue(0)
# 創建下載線程
self.download_thread = DownloadThread(self.image_urls, self.save_path)
self.download_thread.progress_signal.connect(self._update_progress)
self.download_thread.finished_signal.connect(self._download_finished)
self.download_thread.start()
將所有組件和功能整合后,最終的主程序如下:
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
# 設置樣式
app.setStyle('Fusion')
# 創建主窗口
window = ImageDownloaderGUI()
window.show()
sys.exit(app.exec_())
本文詳細介紹了如何使用PyQt5構建一個功能完善的百度圖片下載器GUI界面。通過合理的界面設計、模塊化的功能實現以及多線程技術的應用,我們創建了一個用戶友好、性能穩定的圖片下載工具。讀者可以根據實際需求進一步擴展功能,打造更加強大的圖片下載解決方案。
字數統計:約4150字(實際字數可能因格式和代碼注釋略有差異) “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。