记一次pyinstaller打包pygame项目为exe的过程(带图片)


Posted in Python onMarch 02, 2020

一段简单的pygame代码,只在pygame界面背景绘制了一个背景图片

# -*- coding=utf-8 -*-
import sys
import pygame

pygame.init()
screen = pygame.display.set_mode((400,300))

bg_image = pygame.image.load('bg.jpeg')
bg_image = pygame.transform.scale(bg_image, (400, 300))

while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.quit()
			sys.exit()

	screen.blit(bg_image, (0, 0))
	pygame.display.update()

目录下只有两个game.py和一个bg.jpeg图片

记一次pyinstaller打包pygame项目为exe的过程(带图片)

程序运行是正常的

记一次pyinstaller打包pygame项目为exe的过程(带图片)

现在进行pyinstaller打包,一般打包是执行pyinstaller -F -w game.py,执行后看到多了一个build文件夹、一个dist文件夹和一个game.spec文件

记一次pyinstaller打包pygame项目为exe的过程(带图片)

到dist目录下双击下game.exe,很不幸,会提示Failed to execute script pyi_rth_pkgres

记一次pyinstaller打包pygame项目为exe的过程(带图片)

这个问题主要是我这目录里没有虚拟环境,需要import的库找不到,现在增加一个-p参数添加python包的路径
pyinstaller -p C:\Users\xxx\AppData\Local\Programs\Python\Python37\Lib\site-packages -F -w game.py
打包后再次执行,发现错误

记一次pyinstaller打包pygame项目为exe的过程(带图片)

换了一个错误,但已经执行不成功,为了知道是什么错误,将打包命令改为
pyinstaller -p C:\Users\xxx\AppData\Local\Programs\Python\Python37\Lib\site-packages -F -c game.py
然后将exe拉进cmd窗口里执行

记一次pyinstaller打包pygame项目为exe的过程(带图片)

现在可以看到错误了,是说图片文件找不到,把图片拷到exe目录是不是就可以了呢?拷过来以后确实可以正常运行,那么有没有办法把exe一起打包到exe里面呢?
是可以的,要做下面两步

1.修改下代码,将图片路径的构造方式有相对路径变为构造绝对路径,因为在执行exe时资源文件会被解压到C:\Users\xxx\AppData\Local\Temp_MEI33282这样的一个名称随机的文件夹

# -*- coding=utf-8 -*-
import os, sys
import pygame

def resource_path(relative):
	if hasattr(sys, "_MEIPASS"):
		absolute_path = os.path.join(sys._MEIPASS, relative)
	else:
		absolute_path = os.path.join(relative)
	return absolute_path

pygame.init()
screen = pygame.display.set_mode((400,300))

bg_image = pygame.image.load(resource_path('bg.jpeg'))
bg_image = pygame.transform.scale(bg_image, (400, 300))

while True:
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			pygame.quit()
			sys.exit()

	screen.blit(bg_image, (0, 0))
	pygame.display.update()

2.打开前面生成的那个game.spec来编辑,只需要编辑下面EXE那部分,修改成

exe = EXE(pyz,
     a.scripts,
     a.binaries,
     a.zipfiles,
     a.datas,
     [('bg.jpeg','D:\\mycode\\bg.jpeg','DATA')],
     name='game',
     debug=False,
     bootloader_ignore_signals=False,
     strip=False,
     upx=True,
     upx_exclude=[],
     runtime_tmpdir=None,
     console=True )

在a.datas下方的数组里填上要打包的图片,如果是两个图片,那么写成

[('bg.jpeg','D:\\mycode\\bg.jpeg','DATA'),('bg2.jpeg','D:\\mycode\\bg2.jpeg','DATA')]

这样的格式

修改完文件后再次打包时需要注意,这次执行打包需要用pyinstaller game.spec这种指定spec文件的方式打包,再次运行打包后的exe终于发现现在可以正常运行了。但是现在还多一个控制台的黑窗没去掉,回到game.spec,把console=True这一行,改成console=Flase后再用pyinstaller game.spec打包就完美结束了。

到此这篇关于记一次pyinstaller打包pygame项目为exe的过程(带图片)的文章就介绍到这了,更多相关pyinstaller打包pygame为exe内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python关闭windows进程的方法
Apr 18 Python
python删除某个字符
Mar 19 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
python协程之动态添加任务的方法
Feb 19 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
python实现银行管理系统
Oct 25 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
详解Python流程控制语句
Oct 28 Python
分析Python感知线程状态的解决方案之Event与信号量
Jun 16 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 #Python
Python 调用有道翻译接口实现翻译
Mar 02 #Python
Python selenium抓取虎牙短视频代码实例
Mar 02 #Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 #Python
python mysql 字段与关键字冲突的解决方式
Mar 02 #Python
python3实现往mysql中插入datetime类型的数据
Mar 02 #Python
python3将变量写入SQL语句的实现方式
Mar 02 #Python
You might like
无线电广播的开始
2002/01/30 无线电
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
TP5(thinkPHP框架)实现后台清除缓存功能示例
2019/05/29 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
js window.event对象详尽解析
2009/02/17 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
2013/04/26 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
JavaScript中使用指数方法Math.exp()的简介
2015/06/15 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
Python实现配置文件备份的方法
2015/07/30 Python
python制作爬虫并将抓取结果保存到excel中
2016/04/06 Python
python 文件转成16进制数组的实例
2018/07/09 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
Python 的 __str__ 和 __repr__ 方法对比
2020/09/02 Python
python基于openpyxl生成excel文件
2020/12/23 Python
一套C#面试题
2013/10/09 面试题
自动化系在校本科生求职信
2013/10/23 职场文书
资源环境与城市管理专业推荐信
2013/11/30 职场文书
拆迁委托协议书
2014/09/15 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers