

废话 不多说,直接上代码!!!
UI.py
self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)self.scrollArea.setGeometry(QtCore.QRect(20, 130, 541, 511))self.scrollArea.setWidgetResizable(True)self.scrollArea.setObjectName("scrollArea")
主文件
class ClickableQLabel(QLabel):clicked = pyqtSignal()def __init__(self, parent=None):super().__init__(parent)def mousePressEvent(self, event):self.clicked.emit()
def select_function_callback(self, result):self.pushButton_select.setText('点击查询')if result.get("data"):self.duanju_select_data = result.get("data")self.image_label.setVisible(False)self.scrollArea.setVisible(True)self.scrollAreaWidgetContents = QtWidgets.QWidget()self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 539, 510))self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")data_num = len(result.get('data'))if data_num > 5:newHeight = 510 + ((data_num - 5) * 100)self.scrollAreaWidgetContents.setMinimumSize(540, newHeight)loguru.logger.info(f"self.duanju_select_data ---- {len(self.duanju_select_data)}")for index, values in enumerate(self.duanju_select_data):for_frame = f"for_frame_{str(index)}"self.for_frame = QtWidgets.QFrame(self.scrollAreaWidgetContents)self.for_frame.setGeometry(QtCore.QRect(0, index * 100, 540, 101))self.for_frame.setFrameShape(QtWidgets.QFrame.StyledPanel)self.for_frame.setFrameShadow(QtWidgets.QFrame.Raised)self.for_frame.setObjectName(for_frame)self.head_img = QtWidgets.QLabel(self.for_frame)self.head_img.setGeometry(QtCore.QRect(10, 10, 71, 81))self.head_img.setObjectName("head_img")right_video_headImg_url = QImage.fromData(requests.get(values.get('head_img')).content)self.head_img.setPixmap(QPixmap(right_video_headImg_url).scaled(QSize(70, 80)))font = QtGui.QFont()font.setFamily("微软雅黑")font.setPointSize(9)self.duanju_name = QtWidgets.QLabel(self.for_frame)self.duanju_name.setGeometry(QtCore.QRect(100, 40, 110, 30))self.duanju_name.setObjectName("duanju_name")self.duanju_name.setFont(font)self.duanju_name.setText(values.get('duanju_name'))self.duanju_type = QtWidgets.QLabel(self.for_frame)self.duanju_type.setGeometry(QtCore.QRect(225, 40, 60, 30))self.duanju_type.setObjectName("duanju_type")self.duanju_type.setFont(font)self.duanju_type.setText(values.get('duanju_type'))self.duanju_palyCount = ClickableQLabel(self.for_frame)self.duanju_palyCount.setGeometry(QtCore.QRect(320, 40, 40, 30))self.duanju_palyCount.setObjectName("duanju_palyCount")self.duanju_palyCount.setFont(font)self.duanju_palyCount.setText(str(int(values.get('duanju_palyCount'))))self.duanju_palyCount.clicked.connect(partial(self.on_qlable_clicked, values.get("duanju_palyCount")))self.duanju_jiShu = ClickableQLabel(self.for_frame)self.duanju_jiShu.setGeometry(QtCore.QRect(390, 40, 30, 30))self.duanju_jiShu.setObjectName("duanju_jiShu")self.duanju_jiShu.setFont(font)self.duanju_jiShu.setText(str(int(values.get('duanju_jishu'))))self.duanju_jiShu.clicked.connect(partial(self.on_qlable_clicked, values.get("duanju_jishu")))self.downloads_video = QtWidgets.QPushButton(self.for_frame)self.downloads_video.setGeometry(QtCore.QRect(455, 30, 60, 40))self.downloads_video.setObjectName("downloads_video")self.downloads_video.setFont(font)self.downloads_video.setText('下载')self.downloads_video.clicked.connect(partial(self.downloads_video_click, values))self.scrollArea.setWidget(self.scrollAreaWidgetContents)else:self.showMsg("重要提示", result["msg"])
class DownloadsVideo(QThread):downloadsVideoSignal = pyqtSignal(str)def __init__(self):super(DownloadsVideo, self).__init__()self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"}self.video_id_list = []self.output_path = Noneself.manager = QNetworkAccessManager()def restart(self, video_id_list, output_path):self.video_id_list = video_id_listself.output_path = output_pathdef run(self):for video_info in self.video_id_list:video_id = video_info.get("vid")vidIndex = int(video_info.get("vidIndex"))get_videoDownload_url = f"http://0.0.0.0:5000/api/v1/xxxxxxxx/getmodel?id={video_id}"for i in range(10):request = QNetworkRequest(QUrl(get_videoDownload_url))request.setHeader(QNetworkRequest.UserAgentHeader, self.headers["User-Agent"])reply = self.manager.get(request) event_loop = QEventLoop()reply.finished.connect(event_loop.quit)event_loop.exec_()if reply.error() == QNetworkReply.NoError:respon_text = reply.readAll().data().decode()loguru.logger.info(f"respon --- {respon_text}")status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)loguru.logger.info(f"Status code: {status_code}")if "url" in respon_text:respon = json.loads(respon_text)if respon.get("data").get("map"):download_url = respon.get("data").get("map").get("result").get("url")downloads_res = self.download_video(download_url, vidIndex)if downloads_res["is_downloads"]:self.downloadsVideoSignal.emit(f"{downloads_res['output_path_name']} 下载成功")else:self.downloadsVideoSignal.emit(f"{downloads_res['output_path_name']} 下载 失败")breakelse:status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)error_message = reply.errorString()if i == 9:self.downloadsVideoSignal.emit("当前视频无法下载")time.sleep(random.randint(1, 5))def download_video(self, download_url, vidIndex):filename = f"第{vidIndex}集.mp4"output_path_name = self.output_path + filenamefor i in range(10):response = requests.get(download_url, stream=True)if response.status_code == 200:with open(output_path_name, 'wb') as f:for chunk in response.iter_content(chunk_size=1024):if chunk: f.write(chunk)return {"is_downloads": True,"output_path_name": output_path_name}else:if i == 9:return {"is_downloads": False,"output_path_name": output_path_name}time.sleep(random.randint(1, 3))
def on_qlable_clicked(self, values):loguru.logger.info(f"value --- {values}")clipboard = qApp.clipboard()clipboard.setText(str(int(values)))
def download_video_callback(self, strIng):self.textBrowser.append(strIng)
自定义 QLable 实现 点击方法
class ClickableQLabel(QLabel):clicked = pyqtSignal()def __init__(self, parent=None):super().__init__(parent)def mousePressEvent(self, event):self.clicked.emit()
放置本地图片
self.image_label = QtWidgets.QLabel(self.centralwidget)
self.image_label.setGeometry(QtCore.QRect(20, 130, 540, 511))
pixmap = QtGui.QPixmap(":aaa.jpeg")
if pixmap.isNull():print("无法加载图片")
else:self.image_label.setPixmap(pixmap)self.image_label.setScaledContents(True)
将 输入框 设置 只读
self.folder_lineEdit.setReadOnly(True)
关闭 QScrollArea 水平滚动条
self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
选择 文件夹
def open_folder_dialog(self):folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")if folder_path:self.folder_lineEdit.setText(folder_path)else:self.showMsg('Error', '请选择一个文件夹')
打包 时 包换本地图片
1、新建 ".qrc" 结尾 的文件 如:demo.qrc 2、将下面代码放入 demo.qrc 文件中:<RCC><qresource prefix="/"><file>文件名称</file> <file>logo.ico</file><!-- 添加更多图片或其他资源 --></qresource></RCC>3、 命令行 执行 命令:pyrcc5 -o demo.py demo.qrc 4、将 主程序 中 用到图片 的地方 ,名称一定要和在 demo.qrc里面的一致 在地址前面 加 ":" 例如:pixmap = QtGui.QPixmap(":aaa.jpeg") self.setWindowIcon(QIcon(':logo.ico'))
点击方法
self.pushButton_select_file.clicked.connect(self.open_folder_dialog)self.selectDuanjun = SelectDuanJu()self.selectDuanjun.selectDuanJuSignal.connect(self.select_function_callback)
设置 pyqt5 打包 .exe 的左上角图标以及软件名称:
self.setWindowTitle("HongGuoApp短剧下载")self.setWindowIcon(QIcon(':logo.ico'))
打包命令
pyinstaller -F -w -n 软件名称 -i .\newLogon.ico .\主程序.py .\demo.py