pyqt5 pyinstaller 打包 QThread QLable QscrollArea 滑动 红果短剧

news2024/11/16 21:48:07

请添加图片描述请添加图片描述

废话 不多说,直接上代码!!!

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")

主文件

 # 自定义  QLable 实现 可点击 方法
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")
            # lable 显示 网络 图片
            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 = None
        self.manager = QNetworkAccessManager()

    def restart(self, video_id_list, output_path):
        self.video_id_list = video_id_list
        self.output_path = output_path

    def 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)  # 使用 QNetworkAccessManager 发送异步请求
                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']} 下载 失败")
                        break
                else:
                    status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
                    # loguru.logger.info(f"Status code: {status_code}")
                    error_message = reply.errorString()
                    # loguru.logger.info(f"Error message: {error_message}")
                    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 + filename
        # print(f"output_path_name --- {output_path_name}")
        # 使用requests下载视频
        for i in range(10):
            response = requests.get(download_url, stream=True)
            # 检查响应状态码是否为200(成功)
            if response.status_code == 200:
                with open(output_path_name, 'wb') as f:
                    for chunk in response.iter_content(chunk_size=1024):
                        if chunk:  # 过滤掉keep-alive产生的空数据包
                            f.write(chunk)
                # print(f"Video downloaded successfully to {output_path_name}")
                return {
                    "is_downloads": True,
                    "output_path_name": output_path_name
                }
            else:
                if i == 9:
                    # print(f"Failed to download video. Response status code: {response.status_code}")
                    return {
                        "is_downloads": False,
                        "output_path_name": output_path_name
                    }
            time.sleep(random.randint(1, 3))


# 点击 QLable 实现 粘贴板 复制
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:
    # 设置 QLabel 的 pixmap
    self.image_label.setPixmap(pixmap)
    # 自动调整 QLabel 的大小以适应图片大小
    self.image_label.setScaledContents(True)

将 输入框 设置 只读

# 将 lineEdit 输入框 设置为 只读
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'))

点击方法

	# QButton 绑定 点击方法
	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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea2018导入多个javaweb项目-学习笔记

多个javaweb项目导入 file-> Project Structure 确认&#xff0c;test项目的依赖jar包&#xff0c;引入tomcat jar包。 到此导入javaweb并配置完成 </article>

延迟减少10倍!OCD:基于以目标为中心Diffusion的高效视频编辑方法

基于扩散的视频编辑已经取得了令人瞩目的质量&#xff0c;可以根据文本编辑提示转换给定视频输入的全局风格、局部结构和属性。然而&#xff0c;这类解决方案通常需要大量的内存和计算成本来生成时间上连贯的帧&#xff0c;无论是以扩散反演还是跨帧注意力的形式。在本文中&…

MtimeMtimecmp

Mtime: 实时time计数器&#xff0c;可读可写&#xff1b;mtime必须按照一个固定的频率递增&#xff1b;如果count overflow了&#xff0c;则mtime的值需要卷绕&#xff1b;对于32/64的系统来说&#xff0c;mtime的值都是64bits的&#xff1b; 与mtime对应的&#xff0c;还有一…

uniap vue3 组件使用uni.createSelectorQuery() 获取dom报错

由于vue3中没有this&#xff0c;所以使用uni.createSelectorQuery().in(this)时&#xff0c;会报错 使用 getCurrentInstance 获取组件实例 使用 uni.createSelectorQuery() 批量查询时&#xff0c;结果是按照查询的顺序返回的 使用示例 import { getCurrentInstance } from…

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;利用技能点属性分析角色数据基址-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;367aa71f60b…

conda环境下No module named ‘pytorch_lightning‘问题解决

1 问题描述 在训练wav2lip模型时&#xff0c;出现如下错误&#xff1a; D:\.conda\wav2lip\python.exe D:/ml/wav2lip384/parallel_syncnet_tanh.py --data_root D:/ml/Wav2Lip/data/25fps_out/ --checkpoint_dir syncnet_checkpoints/ --checkpoint_path Traceback (most re…

怎样获取power shell 的全部可用命令?5/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmd…

LeetCode 每日一题 Day 37-43

终于考完试了&#xff0c;寒假期间将会每天持续更新&#xff01; 447. 回旋镖的数量(Day 37) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧…

鸿蒙Harmony--状态管理器--@Provide装饰器和@Consume装饰器详解

今天是1月11日号星期四&#xff0c;农历腊月初一&#xff0c;辞旧的岁月里&#xff0c;愿你守得云开、终见月明&#xff0c;迎新的时光中&#xff0c;愿你心御寒冬、顺遂无忧&#xff0c;岁末冬深&#xff0c;希望接下来的日子里足够幸运&#xff0c;攒足勇气、信心和运气&…

基于Java SSM框架实现学生成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生成绩管理系统演示 摘要 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#…

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…

浏览器中把HTML转为PDF的几种方式

浏览器中把HTML转为PDF的几种方式 打印 操作步骤 另存为pdf 优点 简便易用&#xff1a; 浏览器自带的打印功能通常是用户界面友好的&#xff0c;不需要额外的插件或工具&#xff0c;用户只需点击几下即可完成转换。 跨平台支持&#xff1a; 大多数现代浏览器都支持这种方…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C++)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;NEOAPI SDK联合OpenCV进行图…

Asynchronous FIFO and synchronous FIFO-翻译自外网

Synchronous FIFO 先进先出 (FIFO) 是一种非常流行且有用的设计块&#xff0c;用于模块之间的同步和握手机制。 FIFO 的深度&#xff1a; FIFO 中的槽数或行数称为 FIFO 的深度。 FIFO 的宽度&#xff1a;每个槽或行中可以存储的位数称为 FIFO 的宽度。 在同步 FIFO 中&…

大屏项目:react中实现3d效果的环形图包括指引线

参考链接3d环形图 3d效果的环形图 项目需求实现方式指引线&#xff08;线的样式字体颜色&#xff09; 项目需求 需要在大屏上实现一个3d的环形图&#xff0c;并且自带指引线&#xff0c;指引线的颜色和每段数据的颜色一样&#xff0c;文本内容变成白色&#xff0c;数字内容变…

投标文件组成分析

标注组成&#xff1a; 标书内容&#xff1a; 一、前面内容 1、投标首页&#xff08;正本/副本&#xff09;/ 2、评分索引表&#xff08;来源于“招标文件的评分细则表”&#xff0c;一般在原有的“评分细则表”的后面添加一列“所在页码”&#xff0c;里面填写得分对应“页…

CentOS stream 9最小化安装说明

Server with GUI&#xff1a;An integrated , easy-to-manage server with a graphical interface. 带有图形用户界面的服务器&#xff1a;集成、易于管理的服务器&#xff0c;带有图形界面。Server&#xff1a;An integrated , easy-to-manage server. 服务器&#xff1a;集成…

服务器 conda update 失败解决方法

1. 强制 conda update 租借一台服务器&#xff0c;发现 conda 版本是4.10.3&#xff0c;需要升级&#xff0c;使用了如下命令都没有效果&#xff0c;仍然是一样的版本 conda update conda update --all conda update -n base -c defaults conda最后强制用conda-forge通道更新…

工作再忙,这个门禁管理小技巧也要学!

在现代社会&#xff0c;随着城市化和科技的迅猛发展&#xff0c;安全管理已经成为社会的一项首要任务。在这个背景下&#xff0c;门禁监控系统作为一种高效、先进的安全管理工具&#xff0c;逐渐成为各类场所、机构和企业的不可或缺的一部分。 客户案例 医疗机构 湖南某大型医…

2.IHRM人力资源 - 登录

一、登录页结构与表单开发 我们要实现的登录界面 目前的登录界面 1.1 登录页结构 复制下面的代码到views/login/index.vue页面下 <template><div class"login-container"><div class"logo"/><div class"form"><h1&…