[全]用Python+PyQt5制作视频数据下载工具

合集下载

用Python实现Youku视频批量下载

用Python实现Youku视频批量下载

用Python实现Youku视频批量下载用Python实现Youku视频批量下载分类:python2013-06-13 14:1315人阅读评论(0)收藏举报用Python实现Youku视频批量下载前段时间由于收集视频数据的需要,自己捣鼓了一个YouKu视频批量下载的程序。

东西虽然简单,但还挺实用的,拿出来分享给大家。

版本:Python2.7+BeautifulSoup3.2.1importurllib,urllib2,sys,osfrom BeautifulSoup import BeautifulSoupimport itertools,reurl_i =1pic_num = 1#自己定义的引号格式转换函数def _en_to_cn(str): obj = itertools.cycle(['“','”'])_obj = lambda x: obj.next()return re.sub(r"['\"]",_obj,str)if __name__ == '__main__': #下载连续3个网页的视频while url_i <= 3:webContent =urllib2.urlopen("/focus/index/_page2 6716_" + str(url_i) + ".html")data = webContent.read() #利用BeautifulSoup读取视频列表网页数据soup = BeautifulSoup(data)print "-------------------------Page " + str(url_i) +"-------------------------"#获得相应页面的视频thumbnail和title的listtag_list_thumb = soup.findAll('li','v_thumb')tag_list = soup.findAll('li', "v_title")for item in tag_list:#通过每个thumbnail中的herf导向视频播放页面web_video_play =urllib2.urlopen(item.a['href'])data_vp = web_video_play.read()#利用BeautifulSoup读取视频播放网页数据soup_vp = BeautifulSoup(data_vp)#找到“下载”对应的链接tag_vp_list = soup_vp.findAll('a', id = 'fn_download')for item_vp in tag_vp_list:#将下载链接保存到url_dw中url_dw = '"' + item_vp['_href'] + '"'print item.a['title'] + ": " + url_dw#调用命令行运行iku下载视频,需将iku 加入环境变量os.system("iku " + url_dw) #保存每个视频的thumbnailfor item_thumb in tag_list_thumb:urllib.urlretrieve(item_thumb.img['src'], "E:\\下载视频\\thumbnails\\" + str(pic_num) + "." +_en_to_cn(item_thumb.img['title']) + ".jpg")pic_num += 1print"--------------------------------------------------------------"print "--------Page " + str(url_i) + "'s video thumbnails have been saved!"url_i += 1 程序思想很简单,就是通过解析网页数据找到相应的视频播放网页链接,然后根据播放页面找到下载的链接,如下图所示:由于从网页数据中获得的下载链接是必须通过youku自己的iku才能下载的。

Python-3.5.2--官方入门指南-中文版

Python-3.5.2--官方入门指南-中文版

Python 入门指南目录Python 入门指南 (1)1. 开胃菜 (5)2. 使用Python 解释器 (6)2.1. 调用Python 解释器 (6)2.1.1. 参数传递 (8)2.1.2. 交互模式 (8)2.2. 解释器及其环境 (8)2.2.1. 源程序编码 (8)3. Python 简介 (9)3.1. 将Python 当做计算器 (10)3.1.1. 数字 (10)3.1.2. 字符串 (12)3.1.3. 列表 (16)3.2. 编程的第一步 (18)4. 深入Python 流程控制 (19)4.1. if 语句 (20)4.2. for 语句 (20)4.3. range() 函数 (21)4.4. break 和continue 语句, 以及循环中的else 子句 (22)4.5. pass 语句 (23)4.6. 定义函数 (24)4.7. 深入Python 函数定义 (26)4.7.1. 默认参数值 (26)4.7.2. 关键字参数 (28)4.7.3. 可变参数列表 (30)4.7.4. 参数列表的分拆 (30)4.7.5. Lambda 形式 (31)4.7.6. 文档字符串 (31)4.7.7. 函数注解 (32)4.8. 插曲:编码风格 (33)5. 数据结构 (34)5.1. 关于列表更多的内容 (34)5.1.1. 把列表当作堆栈使用 (35)5.1.2. 把列表当作队列使用 (36)5.1.3. 列表推导式 (37)5.1.4. 嵌套的列表推导式 (39)5.2. del 语句 (40)5.3. 元组和序列 (40)5.4. 集合 (42)5.6. 循环技巧 (44)5.7. 深入条件控制 (46)5.8. 比较序列和其它类型 (46)6. 模块 (47)6.1. 深入模块 (48)6.1.1. 作为脚本来执行模块 (49)6.1.2. 模块的搜索路径 (50)6.1.3. “编译的” Python 文件 (51)6.2. 标准模块 (51)6.3. dir() 函数 (52)6.4. 包 (55)6.4.1. 从* 导入包 (57)6.4.2. 包内引用 (58)6.4.3. 多重目录中的包 (58)7. 输入和输出 (58)7.1. 格式化输出 (59)7.1.1. 旧式的字符串格式化 (63)7.2. 文件读写 (63)7.2.1. 文件对象方法 (63)7.2.2. 使用json 存储结构化数据 (66)8. 错误和异常 (67)8.1. 语法错误 (67)8.2. 异常 (67)8.3. 异常处理 (68)8.4. 抛出异常 (71)8.5. 用户自定义异常 (71)8.6. 定义清理行为 (73)8.7. 预定义清理行为 (74)9. 类 (75)9.1. 术语相关 (75)9.2. Python 作用域和命名空间 (76)9.2.1. 作用域和命名空间示例 (78)9.3. 初识类 (78)9.3.1. 类定义语法 (79)9.3.2. 类对象 (79)9.3.3. 实例对象 (80)9.3.4. 方法对象 (81)9.3.5. 类和实例变量 (82)9.4. 一些说明 (83)9.5. 继承 (85)9.5.1. 多继承 (86)9.6. 私有变量 (87)9.7. 补充 (88)9.9. 迭代器 (89)9.10. 生成器 (91)9.11. 生成器表达式 (91)10. Python 标准库概览 (92)10.1. 操作系统接口 (92)10.2. 文件通配符 (93)10.3. 命令行参数 (93)10.4. 错误输出重定向和程序终止 (93)10.5. 字符串正则匹配 (94)10.6. 数学 (94)10.7. 互联网访问 (95)10.8. 日期和时间 (95)10.9. 数据压缩 (96)10.10. 性能度量 (96)10.11. 质量控制 (97)10.12. “瑞士军刀” (98)11. 标准库浏览– Part II (98)11.1. 输出格式 (98)11.2. 模板 (100)11.3. 使用二进制数据记录布局 (101)11.4. 多线程 (102)11.5. 日志 (103)11.6. 弱引用 (103)11.7. 列表工具 (104)11.8. 十进制浮点数算法 (105)12. 虚拟环境和包 (106)12.1. 简介 (106)12.2. 创建虚拟环境 (107)12.3. 使用pip 管理包 (108)13. 接下来? (110)14. 交互式输入行编辑历史回溯 (112)14.1. Tab 补全和历史记录 (112)14.2. 其它交互式解释器 (112)15. 浮点数算法:争议和限制 (112)15.1. 表达错误 (116)16. 附录 (118)16.1. 交互模式 (118)16.1.1. 错误处理 (118)16.1.2. 可执行Python 脚本 (118)16.1.3. 交互式启动文件 (119)16.1.4. 定制模块 (119)Python 是一门简单易学且功能强大的编程语言。

Python中的pyqt5模块

Python中的pyqt5模块

Python中的pyqt5模块Python是一种高级编程语言,是由荷兰程序员Guido van Rossum于1990年代初开发的一种大型高级编程语言。

Python语言具有结构化,面向对象,函数编程,模块管理等多种特性,因此在不同领域都得到了广泛应用。

其中,PyQt5模块是Python语言中图形用户界面(GUI)开发方向中的一个重要组成部分,本文围绕此模块展开论述。

1. PyQt5模块介绍PyQt5是Python语言中GUI编程的一个重要模块,它向Python开发者提供了一套完整的GUI编程框架。

PyQt5包含了基于Qt5的各种控件和框架,可以实现各种不同类型的GUI应用。

Qt是一个跨平台的GUI应用程序框架,它可以在Windows,macOS,Linux等不同操作系统上进行部署和开发。

PyQt5模块是Qt框架的Python封装,它提供了Qt中所有主要控件的Python版本,该模块支持多种操作系统,包括Windows,macOS,Linux甚至是Android等智能手机平台。

PyQt5模块自Qt5发布之后,也不断更新迭代以支持新的Qt5版本。

2. PyQt5的安装方法作为一个Python模块,安装PyQt5并不复杂,下面介绍几种常用的安装方法。

2.1使用pip安装Python开发者可以在命令行中使用pip命令来安装PyQt5,只需要输入以下命令:pip install PyQt5使用pip命令自动下载和安装PyQt5的依赖关系和更新版本,也可以使用pip命令安装Wheels文件或Anaconda安装包,二者都会自动安装PyQt5。

2.2下载安装包开发者也可以从官方网站上下载PyQt5的可执行程序进行安装,该安装程序专门为不同的系统环境进行了优化和制作。

需要注意的是,在安装之前要确认Python已经正确安装。

下载安装包后,双击运行,一步步完成安装即可。

3. PyQt5模块常用组件PyQt5提供了各种GUI控件,这些控件可以是文字,图片,按钮,对话框等等。

pyhton pyqt5 用法

pyhton pyqt5 用法

pyhton pyqt5 用法使用PyQt5创建图形用户界面(GUI)是一种相当简单和直观的方式,让我们深入了解其用法。

第一步:安装PyQt5要开始使用PyQt5,首先需要安装它。

可以通过在终端窗口中运行以下命令来安装PyQt5:pip install PyQt5确保您已经安装了Python和pip(Python包管理器)。

第二步:导入必要的模块在编写PyQt5代码之前,我们需要导入一些必要的模块。

这些模块包括`QtWidgets`和`QtCore`,以及根据需要使用的其他模块。

可以按照以下方式导入它们:pythonfrom PyQt5 import QtWidgets, QtGui, QtCore`QtWidgets`模块包含了我们需要创建GUI所需的各种小部件,如窗口、按钮和标签等。

`QtGui`模块用于图形处理和绘图功能。

`QtCore`模块包含了我们需要处理事件和信号等的核心功能。

第三步:创建应用程序对象在开始设计GUI之前,我们需要创建一个应用程序对象。

这个应用程序对象是所有GUI组件的父组件,并且负责接收和处理所有的事件。

可以通过以下代码创建一个应用程序对象:pythonapp = QtWidgets.QApplication([])第四步:创建窗口对象接下来,我们需要创建一个窗口对象。

窗口是GUI的主要组件,包含其他小部件。

可以通过以下代码创建一个窗口对象:pythonwindow = QtWidgets.QWidget()第五步:设置窗口属性在设计GUI之前,我们可以选择设置一些窗口的属性。

这包括窗口的标题、大小和位置等。

可以使用以下代码设置窗口属性:pythonwindow.setWindowTitle("My First PyQt5 Window")window.setGeometry(100, 100, 500, 300)第六步:创建其他小部件现在我们可以创建和设计其他小部件,例如按钮、标签和文本框等。

pyuic5用法

pyuic5用法

pyuic5用法pyuic5是Python PyQt库中的一个命令行工具,用于将Qt Designer设计的GUI 界面转换为Python代码。

通过使用pyuic5,开发者可以更方便地将可视化设计的界面与业务逻辑代码集成在一起。

使用pyuic5的步骤如下:1. 首先,安装PyQt库。

可以使用pip包管理器在命令行中输入以下命令进行安装:`pip install pyqt5`2. 打开Qt Designer,并创建一份GUI设计文件。

在Qt Designer中,可以自由地拖拽、调整界面元素并设置属性,以创建自己想要的界面。

保存设计文件为.ui 格式。

3. 在命令行中使用pyuic5命令将.ui文件转换为.py文件。

命令的格式如下:`pyuic5 -x input.ui -o output.py`,其中`input.ui`是输入的设计文件路径,`output.py`是输出的Python代码文件路径。

转换后的.py文件将包含一个自动生成的类,该类继承自PyQt的QWidget类。

4. 在自己的Python项目中导入转换后的.py文件,并使用其中生成的类创建界面实例。

可以在该类的基础上编写自定义的业务逻辑代码,从而实现特定的功能。

界面实例可以使用show()方法显示出来,或者嵌入到其他的窗口应用程序中。

5. 最后,运行Python代码,即可看到通过pyuic5转换出的界面在程序中显示出来。

使用pyuic5可以大大加速Python GUI开发的过程。

通过将设计和编码分离,开发者可以更好地专注于界面和业务逻辑的设计与实现,提高开发效率并降低出错的可能性。

同时,由于pyuic5生成的代码基于PyQt,具有很好的跨平台性,可以在各种操作系统上运行。

总之,pyuic5是一个有用的工具,能够将Qt Designer设计的界面转化为Python代码,便于开发者将界面与业务逻辑集成,加速Python GUI应用程序的开发过程。

python pandas pyqt5处理excel实例

python pandas pyqt5处理excel实例

python pandas pyqt5处理excel实例标题:利用Python pandas与PyQt5处理Excel的实例教程导言:Excel是一种广泛应用于数据处理和可视化的工具。

而Python中的pandas库和PyQt5库则提供了强大的数据处理和图形界面设计能力。

本文将详细介绍如何使用这两个工具,实现对Excel文件的读取、处理和展示,通过一个实例帮助读者逐步理解。

我们将按照以下步骤进行讲解:1. 导入所需库和模块2. 创建并设置界面3. 读取并预处理Excel数据4. 展示数据5. 保存数据并完成整个程序以下是本文详细的步骤讲解。

第一步:导入所需库和模块在使用前,我们需要导入pandas 和PyQt5 这两个库,同时还需要导入相关的模块。

下面是相应的代码:pythonimport sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabelimport pandas as pd第二步:创建并设置界面在这一步中,我们将使用PyQt5 来创建一个基本的窗口界面,并添加一个文本标签。

下面是相应的代码:pythonclass ExcelViewer(QMainWindow):def __init__(self):super().__init__()self.setGeometry(100, 100, 600, 400)self.setWindowTitle('Excel Viewer')bel = QLabel(self)bel.setGeometry(10, 10, 580, 380)第三步:读取并预处理Excel数据在这一步中,我们将使用pandas 来读取Excel 文件,并对数据进行预处理,以便在界面中展示。

下面是相应的代码:pythondef read_excel_file(file_path):data = pd.read_excel(file_path) # 读取Excel 文件# 对数据进行预处理,例如填充缺失值、处理异常值等return data第四步:展示数据在这一步中,我们将利用第二步中创建的界面,将预处理后的Excel 数据展示在界面中。

基于PyQt5制作数据处理小工具

基于PyQt5制作数据处理小工具

基于PyQt5制作数据处理⼩⼯具需求分析:现在有⼀⼤堆的Excel数据⽂件,需要根据每个Excel数据⽂件⾥⾯的Sheet批量将数据⽂件合并成为⼀个汇总后的Excel数据⽂件。

或者是将⼀个汇总后的Excel数据⽂件按照Sheet拆分成很多个Excel数据⽂件。

根据上⾯的需求,我们先来进⾏UI界⾯的布局设计。

导⼊UI界⾯设计相关的PyQt5模块from PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *应⽤操作相关的模块import sysimport osexcel 数据处理模块import openpyxl as pxlimport pandas as pd看⼀下 UI 界⾯的功能和布局,感觉还可以...下⾯是布局相关的代码块实例def init_ui(self):self.setWindowTitle('Excel数据汇总/拆分器公众号:[Python 集中营]')self.setWindowIcon(QIcon('数据.ico'))self.brower = QTextBrowser()self.brower.setReadOnly(True)self.brower.setFont(QFont('宋体', 8))self.brower.setPlaceholderText('批量数据处理进度显⽰区域...')self.brower.ensureCursorVisible()self.excels = QLineEdit()self.excels.setReadOnly(True)self.excels_btn = QPushButton()self.excels_btn.setText('加载批⽂件')self.excels_btn.clicked.connect(self.excels_btn_click)self.oprate_type = QLabel()self.oprate_type.setText('操作类型')self.oprate_combox = QComboBox()self.oprate_combox.addItems(['数据合并', '数据拆分'])self.data_type = QLabel()self.data_type.setText('合并/拆分')self.data_combox = QComboBox()self.data_combox.addItems(['按照Sheet拆分'])self.new_file_path = QLineEdit()self.new_file_path.setReadOnly(True)self.new_file_path_btn = QPushButton()self.new_file_path_btn.setText('新⽂件路径')self.new_file_path_btn.clicked.connect(self.new_file_path_btn_click)self.thread_ = DataThread(self)self.thread_.trigger.connect(self.update_log)self.thread_.finished.connect(self.finished)self.start_btn = QPushButton()self.start_btn.setText('开始数据汇总/拆分')self.start_btn.clicked.connect(self.start_btn_click)form = QFormLayout()form.addRow(self.excels, self.excels_btn)form.addRow(self.oprate_type, self.oprate_combox)form.addRow(self.data_type, self.data_combox)form.addRow(self.new_file_path, self.new_file_path_btn)vbox = QVBoxLayout()vbox.addLayout(form)vbox.addWidget(self.start_btn)hbox = QHBoxLayout()hbox.addWidget(self.brower)hbox.addLayout(vbox)self.setLayout(hbox)槽函数 update_log,将运⾏过程通过⽂本浏览器的⽅式实时展⽰,⽅便查看程序的运⾏。

python实现视频的下载以及断点续传

python实现视频的下载以及断点续传

python实现视频的下载以及断点续传转⾃:帅b⼤佬---恢复内容开始---⼀般情况下我们使⽤爬⾍更多的应该是爬数据或者图⽚吧,今天在这⾥和⼤家分享⼀下关于使⽤爬⾍技术来进⾏视频下载的⽅法,不仅可以⽅便的下载⼀些体积⼩的视频,针对⼤容量的视频下载同样试⽤。

先上个requests模块的iter_content⽅法这⾥我们使⽤的是python的requests模块作为例⼦,需要获取⽂本的时候我们会使⽤response.text获取⽂本信息,使⽤response.content获取字节流,⽐如下载图⽚保存到⼀个⽂件,⽽对于⼤个的⽂件我们就要采取分块读取的⽅式了,requests.get⽅法的stream第⼀步,我们需要设置requests.get的stream参数为True。

默认情况下是stream的值为false,它会⽴即开始下载⽂件并存放到内存当中,倘若⽂件过⼤就会导致内存不⾜的情况.当把get函数的stream参数设置成True时,它不会⽴即开始下载,当你使⽤iter_content或iter_lines遍历内容或访问内容属性时才开始下载。

需要注意⼀点:⽂件没有下载之前,它也需要保持连接。

下⾯我们开始解读标有注释的代码:tqdm是⼀个可以显⽰进度条的包,具体的⽤法可以参考官⽹⽂档:https:///project/tqdm/(1)设置stream=True参数读取⼤⽂件。

(2)通过header的content-length属性可以获取⽂件的总容量。

(3)获取本地已经下载的部分⽂件的容量,⽅便继续下载,当然需要判断⽂件是否存在,如果不存在就从头开始下载。

(4)本地已下载⽂件的总容量和⽹络⽂件的实际容量进⾏⽐较,如果⼤于或者等于则表⽰已经下载完成,否则继续。

(5)开始请求视频⽂件了(6)循环读取每次读取⼀个1024个字节,当然你也可以设置512个字节---恢复内容结束---。

Python的GUI库PyQt5介绍

Python的GUI库PyQt5介绍

Python的GUI库PyQt5介绍Python的GUI库PyQt5介绍随着计算机技术的迅速发展,进入21世纪以来,图形用户界面(GUI,Graphical User Interface)成为电脑用户交互界面的主流。

但是,电脑操作界面的开发需要特定的GUI工具包支持,而在Python语言中,GUI的主要工具包就是PyQt5。

PyQt5是Python中一个广泛使用的GUI工具包,可用于构建多种类型的应用程序和用户界面。

PyQt5的设计者是Riverbank Computing Limited,其始终致力于为Python和C++等语言开发中提供最佳的GUI解决方案。

一、PyQt5的特性1. PyQT5是一个完全的Python工具包。

PyQt5使得开发者能够将Python语言与Qt GUI库无缝结合起来,从而可以访问Qt的所有功能。

2. PyQT5是一个面向对象的工具包。

PyQt5允许开发者使用面向对象的设计模式构建GUI应用程序。

开发者可以使用PyQt5中提供的各种对象来构建界面组件。

3. PyQT5是一个跨平台的工具包。

PyQt5可以在各种操作系统平台下运行并提供相同的界面设计。

4. PyQT5包括了一系列的GUI控件,经过精心设计界面组件,可以免费地使用在开发的任何应用中。

它们包括列表框、按钮、文本框、标签、单选框、多选框、进度条、滑动条等等。

二、PyQt5的优点1.轻盈易用:PyQt5具有很小的库,同时提供简洁清晰的API,能快速学习和应用。

2.跨平台支持:PyQt5能够无缝的支持任何平台的操作系统,如Windows,Linux,MacOS等。

3.界面美观:PyQt5拥有现代化的图形界面设计,通过界面细节的优化,达到更高的用户和体验。

四、PyQt5的应用场景PyQt5的应用场景非常广泛,常常被用于开发桌面应用和游戏程序。

而且,PyQt5具有大量的扩展库,支持图表绘制、网络通信和线程管理等,进一步拓展了PyQt5的应用场景。

pyqt5编程基本步骤

pyqt5编程基本步骤

pyqt5编程基本步骤PyQt5是一种基于Qt框架的Python编程库,用于创建图形用户界面(GUI)应用程序。

以下是使用PyQt5编写程序的基本步骤:1.安装PyQt5:首先,您需要在您的计算机上安装PyQt5库。

您可以使用pip(Python包管理器)来安装。

在命令行中输入以下命令:pip install PyQt5。

2.导入库:在Python代码中,您需要导入所需的PyQt5模块。

例如:from PyQt5.QtWidgets import QApplication, QWidget。

3.创建应用程序:创建一个QApplication实例,这是应用程序的入口点。

例如:app = QApplication([])。

4.创建窗口:创建一个QWidget实例,这是应用程序的主窗口。

例如:window = QWidget()。

5.设置窗口属性:根据需要设置窗口的属性,如标题、大小、位置等。

例如:window.setWindowTitle("我的窗口")、window.setGeometry(100, 100, 300, 200)。

6.添加控件:在窗口中添加所需的控件,如按钮、文本框等。

例如:button = QPushButton("点击我", window)。

7.布局:使用QGridLayout或QBoxLayout等布局管理器对控件进行布局。

例如:layout = QGridLayout()、layout.addWidget(button, 0, 0)。

8.设置窗口布局:将布局应用于窗口。

例如:window.setLayout(layout)。

9.显示窗口:最后,调用窗口的show()方法以显示窗口。

例如:window.show()。

10.运行应用程序:运行应用程序,等待用户操作。

例如:app.exec_()。


这些是使用PyQt5编写程序的基本步骤。

根据您的需求,您可以在此基础上添加更多功能和控件。

PyQt5编程扩展之资源文件的使用教程

PyQt5编程扩展之资源文件的使用教程

PyQt5编程扩展之资源文件的使用教程PyQt5资源文件被用于在应用程序中存储用于构建用户界面的图形、声音、文本和图像等资源。

这些资源文件可以使用PyQt5自带的Qt全局资源管理器(Qt Resource System)创建和管理,也可以使用第三方工具来构建。

本文将介绍如何使用PyQt5创建和管理资源文件。

首先,要使用PyQt5的资源管理器,需要安装Qt Designer和Qt Resource Compiler(rc.exe)。

Qt Designer可以帮助创建用户界面并定制和复用现有资源,而Resource Compiler则可以将资源文件编译成Qt可以识别的格式。

接下来,我们可以使用Qt Designer来创建.qrc文件,它是一种XML文件格式,用于保存所有将要在应用中使用的资源,如图片、字体和声音等。

可以使用Qt Designer的“文件”菜单下的“新建...”选项来创建新的资源文件。

在创建完成后,使用“文件”菜单的“保存”选项来保存资源文件。

现在,我们需要编译资源文件,以便Qt可以读取它。

为此,可以在命令行中使用Resource Compiler编译.qrc文件,它会生成一个名为.rcc的文件,此文件包含了编译后的资源文件信息,可以用于在代码中引用它们。

最后,要使用PyQt5中的资源文件,需要使用Qt基类(Qt Base Class)中提供的Qt资源管理器(Qt Resource Manager)。

它可以让我们加载编译后的资源文件,并用于应用程序中。

我们可以使用Qt资源管理器的load()函数来加载编译后的资源文件,之后就可以使用addFile()函数添加资源文件的文件路径,以及使用addResource()函数添加资源文件的资源名称。

因此,可以看出,使用PyQt5编程,可以轻松地创建和管理资源文件,它可以帮助开发者更快地开发出优秀的应用程序。

pythontools实现视频的每一帧提取并保存

pythontools实现视频的每一帧提取并保存

pythontools实现视频的每⼀帧提取并保存Preface最近在做 video caption 相关,要处理⼤量视频。

今天碰到⼀个问题,就是要将数据集中的 avi 格式的视频,将其视频中的每⼀帧提取出来。

之后⽤提出的 Optical Flow(光流),提取运动的光流特征。

Method 1⽅法 1 是最简单的,⽤⼯具来完成。

具体的⽹上有很多这⽅⾯的资料,本⼈只是简单了解了⼀下如何使⽤。

如下图,有⼀个名为 ffmpeg_test.avi 的视频:在当前⽬录打开终端,输⼊如下命令:$ffmpeg -i ffmpeg_test.avi frames_%03d.jpg -hide_banner以上我没有指定太多的参数,实际上有很多参数可以指定,如起⽌的时间,⼏秒钟取⼀帧等等。

输⼊即可获得每⼀帧。

Method 2下⾯就是可以⽤ cv2 模块中的 VideoCapture、VideoWriter 来提取了,具体代码如下:#! encoding: UTF-8import osimport cv2import cvvideos_src_path = '/home/ou-lc/chenxp/Downloads/Youtube/youtube_select'videos_save_path = '/home/ou-lc/chenxp/Downloads/Youtube/youtube_frames'videos = os.listdir(videos_src_path)videos = filter(lambda x: x.endswith('avi'), videos)for each_video in videos:print each_video# get the name of each video, and make the directory to save frameseach_video_name, _ = each_video.split('.')os.mkdir(videos_save_path + '/' + each_video_name)each_video_save_full_path = os.path.join(videos_save_path, each_video_name) + '/'# get the full path of each video, which will open the video tp extract frameseach_video_full_path = os.path.join(videos_src_path, each_video)cap = cv2.VideoCapture(each_video_full_path)frame_count = 1success = Truewhile(success):success, frame = cap.read()print 'Read a new frame: ', successparams = []params.append(cv.CV_IMWRITE_PXM_BINARY)params.append(1)cv2.imwrite(each_video_save_full_path + each_video_name + "_%d.ppm" % frame_count, frame, params)frame_count = frame_count + 1cap.release()在最后,我将每⼀帧保存为 PPM 格式。

[全]用Python+PyQt5制作视频数据下载工具

[全]用Python+PyQt5制作视频数据下载工具

用Python+PyQt5制作视频数据下载工具开发环境准备工作首先,新建一个bilibili.py文件。

获取B站视频数据的爬虫代码相对简单,只要设置好url的keyword和page参数,即可轻松获取数据。

以下贴出完整代码:比如keyword输入"打工人",page输入5,运行爬虫代码,即可生成打工人相关的B站视频数据csv文件,数据预览如下:UI设计这里用到一款好用的工具——Qt Designer,通过它用"鼠标拖拽"就能完成窗体设计。

安装Qt Designer配置开发工具安装完Qt Designer后,我们利用PyCharm进行界面开发,下面进行Qt开发工具的配置:Files —> Settings —> Tools —> External Tools —> 点击"+"添加QT Desinger添加Py UIC注:如果是mac环境,需要单独安装Qt,去官网下载开源版本即可。

Qt Designer设计界面在PyCharm中创建一个项目,然后点击“Tools”--“External Tools”--“QT Desinger”打开QT Desinger,如下图:界面介绍工具箱区域:提供GUI界面开发使用的各种基本控件,如单选框、文本框等。

可以拖动到新创建的主程序界面。

主界面区域:用户放置各种从工具箱拖过来的各种控件。

模板选项中最常用的就是Widget(通用窗口)。

对象查看器区域:查看主窗口放置的对象列表。

属性编辑器区域: 提供对窗口、控件、布局的属性编辑功能。

比如修改控件的显示文本、对象名、大小等。

信号/槽编辑器区域:编辑控件的信号和槽函数,也可以添加自定义的信号和槽函数。

界面操作本文以创建Widget窗口为例,通过简单的拖拽,字体和颜色的配置,即可轻松完成如下界面的设计:将ui文件转为py代码界面设计好以后,保存为run.ui文件,选中“run.ui”,在其上点击鼠标右键,到“External Tools”中点击“PyUIC”,即可生成run.py文件:爬虫代码与界面相结合完善run.py,赋给“开始下载”按钮以‘pushButton_click’函数,赋给“存储路径”按钮以‘setBrowerPath’函数:完善爬虫代码,将界面整体框架融入其中:然后在pushButton_click函数中添加代码,接收界面输入的keyword和page 参数,导入接口url中,代码如下:充实setBrowerPath函数,获取数据存储路径,将路径在输出框显示出来:工具打包在cmd控制台使用cd进入py文件所在目录:使用pyinstaller打包:运行完成后,会在当前目录下生成1个dist文件夹和build文件夹,打开dist 文件夹,双击bilibili.exe,工具即可运行。

python基于tkinter制作m3u8视频下载工具

python基于tkinter制作m3u8视频下载工具

python基于tkinter制作m3u8视频下载⼯具⽬录m3u8地址获取程序代码项⽬地址这是我为了学习tkinter⽤python 写的⼀个下载m3u8视频的⼩程序,程序使⽤了多线程下载,下载后⾃动合并成⼀个视频⽂件,⽅便播放。

⽬前的众多视频都是m3u8的播放类型,只要知道视频的m3u8地址,就可以完美下载整个视频。

m3u8地址获取打开浏览器,点开你要获取地址的视频重要的来了,右键>>审查元素或者按F12也可以根据开发或测试的实际环境选择相应的设备,选择iphone6 plus选择好了以后,刷新页⾯,点击漏⽃,选择media,⼀定刷新之后再点击,没出来的话切换⼏下选项卡,就能出来了点击播放视频,在下边就可以看到地址了程序代码# -*- coding: UTF-8 -*-import syssys.path.append("C:\\Python36-32\\Lib\\site-packages")import tkinterimport reimport urllib3import threadpoolimport threadingimport osimport shutilimport timeimport globfrom tkinter.ttk import *from PIL import Image, ImageTkimport pyperclipfrom tkinter.filedialog import askdirectorydef get_image(filename,width,height):im = Image.open(filename).resize((width,height))return ImageTk.PhotoImage(im)def get_resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)def getrealtask(link):global keyrooturl1 = ''rooturl2 = ''pattern3 = pile(r'^.*[\/]', re.M)result11 = pattern3.findall(link)if result11:rooturl1 = result11[0]pattern4 = pile(r'^http[s]?:\/\/[^\/]*', re.M)result114 = pattern4.findall(link)if result114:rooturl2 = result114[0]res = http.request('GET', link)content = str(res.data, 'utf8')list = content.split('\n')reallist = []for one in list:if one.endswith('"key.key"'):keyurl = rooturl1 + "key.key"res = http.request('GET', keyurl)key = str(res.data, 'utf8')if one.endswith('.ts') or one.endswith('.image'):if re.match(r'http', one, re.M | re.I):reallist.append(one)elif re.match(r'\/', one, re.M | re.I):reallist.append(rooturl2 + one)else:reallist.append(rooturl1 + one)if one.endswith('.m3u8'):if re.match(r'\/', one, re.M | re.I):reallist = getrealtask(rooturl2 + one)else:reallist = getrealtask(rooturl1 + one)breakreturn reallistdef download_ts(result):url = result['url']name = result['name']num = result['num']rootpath = result['root']m3u8Name = result['m3u8name']t= str(result['total'])if num % 10000 == 0:print(str(num)+' / '+t)basepath = os.path.join(rootpath,m3u8Name)fullpath = os.path.join(basepath,name)isExist = os.path.exists(fullpath)if not isExist:http = urllib3.PoolManager(timeout=10.0)while(1):try:f = http.request('GET', url)breakexcept:print("URL ERRO: " + url)time.sleep(2)d = f.datawith open(fullpath, "wb") as code:code.write(d)print("SAVE: " + url)def clock2(num,path):global windowglobal keyv3 = tkinter.StringVar();v4 = tkinter.StringVar();l3 = bel(window, text='', textvariable=v3, font=('Arial', 10)) l4 = bel(window, text='', textvariable=v4, font=('Arial', 10)) l3.place(x=10, y=130, anchor='nw')l4.place(x=10, y=160, anchor='nw')v3.set("下载中。

Pycharm+Python+PyQt5使用详解

Pycharm+Python+PyQt5使用详解
-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
6,新建项目 使用designer,新建main window后,使用PyUIC将hello.ui文件转换为hello.py
7,添加main.py,因为ui文件命名为hello,所以import是hello
这篇文章主要介绍了python符号计算之实现函数极限的方法文中通过示例代码介绍的非常详细对大家的学习或者工作具有一定的参考学习价值需要的朋友们下面随着小编来一起学习学习吧
Pych详 解
1,打开cmd安装PyQt5
pip install pyqt5
2,PyQt5不再提供Qt Designer等工具,所以需要再安装pyqt5-tools
import sys import hello from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == '__main__': app = QApplication(sys.argv) MainWindow = QMainWindow() ui = hello.Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
pip install pyqt5-tools
3,打开Pycharm,进入设置,添加外部工具
4,添加QtDesigner,exe的路径在安装目录下C:\Program Files\Python35\Lib\site-packages\pyqt5-tools\designer.exe

PyCharm安装PyQt5及其工具(QtDesigner、PyUIC、PyRcc)详细教程

PyCharm安装PyQt5及其工具(QtDesigner、PyUIC、PyRcc)详细教程

PyCharm安装PyQt5及其⼯具(QtDesigner、PyUIC、PyRcc)详细教程摘要:Qt是常⽤的⽤户界⾯设计⼯具,⽽在Python中则使⽤PyQt这⼀⼯具包,它是Python编程语⾔和Qt库的成功融合。

这篇博⽂通过图⽂详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有⼯具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个⼯具的设置。

最后简单演⽰了PyQt5的调⽤⽅式及三个⼯具的使⽤⽅法。

前⾔很多情况下需要为程序设计⼀个GUI界⾯,在Python中使⽤较多的⽤户界⾯设计⼯具是PyQt。

由于通常我们使⽤较多的IDE是PyCharm,为了⽅便地使⽤PyQt进⾏⽤户界⾯设计,这⾥总结了在PyCharm安装配置的简单安装⽅法。

可能有⼈还不清楚这⼏个⼯具的⽤途,这⾥对要安装配置的依赖包和⼯具简介如下:PyQt5:PyQt5是⼀套Python绑定Digia QT5应⽤的框架。

Qt库是最强⼤的GUI库之⼀,PyQt5做为Python的⼀个模块,它有620多个类和6000个函数和⽅法。

这是⼀个跨平台的⼯具包,它可以运⾏在所有主要的操作系统,包括UNIX,Windows,PyQt5-tools:PyQt5中没有提供常⽤的Qt⼯具,⽐如图形界⾯开发⼯具Qt Designer,PyQt5-tools中包含了⼀系列常⽤⼯具。

Qt Designer:可以通过Qt Designer来编写UI界⾯,Qt Designer的设计符合MVC的架构,其实现了视图和逻辑的分离,从⽽实现了开发的便捷。

Qt Designer中的操作⽅式⼗分灵活,其通过拖拽的⽅式放置控件可以随时查看控件效果。

Qt PyUIC:Qt Designer⽣成的.ui⽂件(实质上是XML格式的⽂件)可以通过pyuic5⼯具转换成.py⽂件。

PyRcc:在使⽤PyQt开发界⾯时,在Qt Designer中使⽤的图⽚等资源需要将其编译为py⽂件,这时需要⽤到PyRcc⼯具⽅便地将qrc⽂件转换为py⽂件。

python中Pyqt5使用Qlabel标签进行视频播放

python中Pyqt5使用Qlabel标签进行视频播放

python中Pyqt5使⽤Qlabel标签进⾏视频播放⽬录⼀、简介⼆、基本⽤法2.1 QLabel控件2.2 QLabel常⽤的信号(事件)三、QLabel播放视频3.1 QTimer3.2 代码Pyqt5安装并配置到pycharm⽅法:⼀、简介QLabel是界⾯中的标签类,继承⾃QFrame类,提供⽂本和图像的显⽰,是⼀种展⽰控件。

QLabel对象可以显⽰不可编辑的⽂本或图⽚,可以放置⼀个GIF动画,还可以被⽤作提⽰标记为其他控件。

纯⽂本、链接或富⽂本也可以显⽰在标签上。

⼆、基本⽤法2.1 QLabel控件setAlignment():按固定值⽅式对齐⽂本,有以下对齐⽅式:Qt.AlignLeft(⽔平⽅向靠左对齐)、Qt.AlignRight(⽔平⽅向靠右对齐)、Qt.AlignCenter(⽔平⽅向居中对齐)、Qt.AlignJustify(⽔平⽅向调整间距两端对齐)、Qt.AlignTop(垂直⽅向靠上对齐)、Qt.AlignBottom(垂直⽅向靠下对齐)、Qt.AlignVCenter(垂直⽅向居中对齐)setIndent():设置⽂本缩进setPixmap():设置QLabel为⼀个Pixmap图⽚text():获得QLabel的⽂本内容setText():设置QLabel的⽂本内容selectedText():返回所选择的字符setBuddy():设置伙伴关系setWordWrap():设置是否允许换⾏2.2 QLabel常⽤的信号(事件)1.linkHovered:当⿏标指针滑过标签中嵌⼊的超链接时,需要⽤槽函数与这个信号进⾏绑定2.linkActivated:当单击标签中嵌⼊的超链接,希望在新窗⼝中打开这个超链接时,setOpenExternalLinks特性必须设置为true三、QLabel播放视频使⽤QLabel播放视频⽂件的重点就在****定时器QTimer当程序中需要显⽰时间时或者需要在程序中周期性地进⾏某项操作,就会⽤到定时器3.1 QTimer导⼊QTimer模块:from PyQt5.QtCore import QTimer初始化:self.timer_camera = QTimer()计时并启动:self.timer_camera.start(1000) # 1000ms == 1sself.timer_camera.timeout.connect(self.openFrame) # 连接槽函数openFrame注意:当QTimer的⽗对象被销毁时,它也会被⾃动销毁。

教你如何使用Python下载B站视频的详细教程

教你如何使用Python下载B站视频的详细教程

教你如何使⽤Python下载B站视频的详细教程前⾔众所周知,⽹页版的B站⽆法下载视频,然本⼈喜欢经常在B站学习,奈何没有⽹时,⽆法观看视频资源,⼿机下载后屏幕太⼩⼜不想看,遂写此程序以解决此问题步骤话不多说,进⼊正题1.在电脑上下载python的开发环境,2.下载pycharm开发⼯具,3.同时按键盘上的win键与r键,在弹出的对话框中输⼊cmd点击确定进⼊cmd命令⾏,在⾥⾯输⼊pip install you-get,之后按键盘enter键,进⾏you-get的下载,下载完后退出cmd4.打开pycharm开发⼯具,新建⼀个python file命名为bilibili,把下⾯的代码复制进去,关于pycharm开发⼯具的使⽤,点我⼀下,观看教程import sysimport you_getfrom multiprocessing import Pool#url ='你要下载的视频链接'#path='你要把视频保存到哪⾥'url = 'https:///video/BV13s411371G?p='path = 'D:/Bzhan/openstack'total=14def down1():start_url = urlpath1 = pathfor i in range(1, 3, 1):url1 = start_url + str(i)download(url1, path1)def down2():start_url = urlpath1 = pathfor i in range(3, 5, 1):url1 = start_url + str(i)download(url1, path1)def down3():start_url = urlpath1 = pathfor i in range(5, 7, 1):url1 = start_url + str(i)download(url1, path1)def down4():start_url = urlpath1 = pathfor i in range(7, 9, 1):url1 = start_url + str(i)download(url1, path1)def down5():start_url = urlpath1 = pathfor i in range(9, 11, 1):url1 = start_url + str(i)download(url1, path1)def down6():start_url = urlpath1 = pathfor i in range(11, 13, 1):url1 = start_url + str(i)download(url1, path1)def down7():start_url = urlpath1 = pathfor i in range(13, 15, 1):url1 = start_url + str(i)download(url1, path1)def down8():start_url = urlpath1 = pathfor i in range(35, 40, 1):url1 = start_url + str(i)download(url1, path1)def download(url, path):sys.argv = ['you-get', '-o', path, url]you_get.main()def main():po = Pool(8)po.apply_async(down1)po.apply_async(down2)po.apply_async(down3)po.apply_async(down4)po.apply_async(down5)po.apply_async(down6)po.apply_async(down7)po.apply_async(down8)po.close()po.join()if __name__ == '__main__':main()接下来就可以运⾏程序,下载视频了5.下⾯这个程序也能实现下载B站视频的功能,不过下载速度简直⽆语,称的上龟速import you_getimport sysimport you_getdef download(url,path):sys.argv=['you-get','-o',path,url]you_get.main()if __name__=='__main__':start_url='https:///video/BV13s411371G?p='path = 'D:/Bzhan/openstack'for i in range(1,14,1):url=start_url +str(i)download(url,path)到此这篇关于教你如何使⽤Python下载B站视频的详细教程的⽂章就介绍到这了,更多相关Python下载B站视频内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器

手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器

手把手教你用Python打造一款批量下载视频并能可视化显示下载进度的下载器今日鸡汤桃之夭夭,灼灼其华。

/1 前言/平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可能会让你无网可上。

这个时候那些好看的电视剧和电影自然是无法观看了,本期我们要讲的就是怎样下载这些视频。

/2 项目目标/通过Python程序对所感兴趣的视频进行批量下载。

正好小编近期看到一些不错的视频,因为想往安卓方向走,但又苦于重新学习太复杂,有没有简单点的,之前好像有什么e4a但是要学易语言就放弃了,于是乎在茫茫网络发现了一个小众的编程语言---裕语言。

好家伙,不说了,赶紧下载,盘它。

/3 效果展示/1、采用sublime text 3 编写程序,先看看效果。

接下来,由小编为大家展现程序的具体实现步骤。

/4 实现步骤/1、分析网页结构。

老样子,审查元素定位,如下图所示。

2、发现视频全都在a标签里面,因为这个页面的视频比较多,所以我们继续分析页面,发现一个神奇的事情。

哈哈,原来所有的视频都在class为videoDown的a标签里,有了这个重要的信息就什么都好办了。

3、直接上代码和注释。

••••••••••••••••••••#解析页面def parser():ab=[]rep=requests.get(':93/iappce.htm#sp',timeout=5,headers=h eaders)rep.encoding='utf-8'soup=BeautifulSoup(rep.text,'html.parser')res=soup.find_all('a',class_='videoDown')#寻找所有class为videoDown的a标签for y in res:ab.append(':93'+y.attrs['href']) #将获取到的视频URL地址添加到列表中return ab #返回所有视频地址的列表这样就轻轻松松拿到了页面所有的视频地址,是不是超级简单了?4、接下来就是下载文件。

编译pyqt5源码

编译pyqt5源码

编译pyqt5源码全文共四篇示例,供读者参考第一篇示例:编译PyQt5源码PyQt是一种用于Python的开发工具包,允许开发者使用Qt库来构建图形用户界面(GUI)应用程序。

PyQt包括了许多模块,其中PyQt5是其中最新且功能最强大的一个版本。

虽然PyQt5提供了许多现成的组件和功能,但有时候我们需要对PyQt5进行自定义的编译以满足特定需求。

为什么要编译PyQt5源码呢?编译PyQt5源码可以让我们对PyQt5进行定制化,比如添加特定的功能或者删除不需要的组件。

编译PyQt5源码还可以提高程序的性能,因为我们可以根据需要进行优化。

在某些情况下,我们可能需要在不同的操作系统平台上使用PyQt5,那么编译源码就显得尤为重要。

我们需要下载PyQt5的源码包。

可以在Riverbank Computing 的官方网站上找到最新的PyQt5源码包。

下载完成后,解压到一个指定的目录。

2. 安装Qt库PyQt5是建立在Qt库之上的,所以在编译PyQt5之前,我们需要先安装Qt库。

可以在Qt的官方网站上找到最新的Qt库并按照官方文档进行安装。

3. 安装sip编译PyQt5源码之前,我们需要打开命令行窗口,并进入PyQt5源码所在目录。

然后运行以下命令:```bashpython configure.pymakemake install```编译过程可能需要一些时间,取决于你的机器性能以及编译的内容。

完成编译后,我们就可以开始使用自定义的PyQt5库了。

5. 测试PyQt5库我们可以编写一个简单的Python脚本来测试我们编译的PyQt5库是否正常工作。

以下是一个简单的示例代码:app = QApplication(sys.argv)label = QLabel("Hello World!")label.show()sys.exit(app.exec_())```运行上述代码,如果能看到一个显示“Hello World!”的窗口,那么表示我们编译的PyQt5库工作正常。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用Python+PyQt5制作视频数据下载工具
开发环境
准备工作
首先,新建一个bilibili.py文件。

获取B站视频数据的爬虫代码相对简单,只要设置好url的keyword和page参数,即可轻松获取数据。

以下贴出完整代码:
比如keyword输入"打工人",page输入5,运行爬虫代码,即可生成打工人相关的B站视频数据csv文件,数据预览如下:
UI设计
这里用到一款好用的工具——Qt Designer,通过它用"鼠标拖拽"就能完成窗体设计。

安装Qt Designer
配置开发工具
安装完Qt Designer后,我们利用PyCharm进行界面开发,下面进行Qt开发工具的配置:Files —> Settings —> Tools —> External Tools —> 点击"+"
添加QT Desinger
添加Py UIC
注:如果是mac环境,需要单独安装Qt,去官网下载开源版本即可。

Qt Designer设计界面
在PyCharm中创建一个项目,然后点击“Tools”--“External Tools”--“QT Desinger”打开QT Desinger,如下图:
界面介绍
工具箱区域:提供GUI界面开发使用的各种基本控件,如单选框、文本框等。

可以拖动到新创建的主程序界面。

主界面区域:用户放置各种从工具箱拖过来的各种控件。

模板选项中最常用的就是Widget(通用窗口)。

对象查看器区域:查看主窗口放置的对象列表。

属性编辑器区域: 提供对窗口、控件、布局的属性编辑功能。

比如修改控件的显示文本、对象名、大小等。

信号/槽编辑器区域:编辑控件的信号和槽函数,也可以添加自定义的信号和槽函数。

界面操作
本文以创建Widget窗口为例,通过简单的拖拽,字体和颜色的配置,即可轻松完成如下界面的设计:
将ui文件转为py代码
界面设计好以后,保存为run.ui文件,选中“run.ui”,在其上点击鼠标右键,到“External Tools”中点击“PyUIC”,即可生成run.py文件:
爬虫代码与界面相结合
完善run.py,赋给“开始下载”按钮以‘pushButton_click’函数,赋给“存储路径”按钮以‘setBrowerPath’函数:
完善爬虫代码,将界面整体框架融入其中:
然后在pushButton_click函数中添加代码,接收界面输入的keyword和page 参数,导入接口url中,代码如下:
充实setBrowerPath函数,获取数据存储路径,将路径在输出框显示出来:
工具打包
在cmd控制台使用cd进入py文件所在目录:
使用pyinstaller打包:
运行完成后,会在当前目录下生成1个dist文件夹和build文件夹,打开dist 文件夹,双击bilibili.exe,工具即可运行。

如果是mac环境可以使用py2app 进行打包。

相关文档
最新文档