版权申明:此博文后期必火,本人原创,转载请注明出处。
前言:python这个东西,跟按键精灵类似,都属于脚本语言。按键精灵编写脚本的时候,有个很好使的功能,那就是打包的exe程序可以添加附件,运行程序的时候能够释放附件并进行一些操作。按键精灵除了不能在附件里面添加exe的文件之外,基本上其他附件都支持添加。相似的软件还有易语言,易语言的资源表里是可以加入图片和音乐等东西的。
1. 程序内加入附件的作用:
现在脚本写程序时,为了保证文件的轻便性,最好是一个单独的exe文件就行了,不要安装或者依赖一大堆的文件夹,我们采用在文件程序里加入附件并打包exe单文件发布,用户运行脚本后自动根据程序释放带入的资源文件到计算机本地,用户只需要这一个单文件,无需看到其他碍眼的一堆文件夹等非主程序。
2.类似的应用场景:
2.1.众所周知,python直接打包exe是不带图标的,我们可以通过此方式在文件里加入图片资源,然后打包的exe释放图片资源作为程序自身的图标。同理,音乐之类的也能打包,然后作为程序自身的提示音bgm
2.2现在易语言基本上已经是编写自动化游戏脚本与外挂的王者了,但是他们那群人万万没想到,其实python也是个王者。怎么说呢,大漠插件,乐玩插件这种dll文件,python打包的exe也能直接释放到本地,并且进行注册等操作,而且python更牛逼的是,易语言的exe基本上一释放文件就会报毒被清理,甚至一个空白的exe都会报毒,而python从来没有报毒的说法。于是乎,python资源里加入dll文件,sqlite3文件,编译成独立的exe作为游戏脚本主程序显得理所当然。
2.3python在游戏脚本方面的优势:这个共有三点:
2.3.1.可以直接拿易语言编译的dll文件进行调用,基于32位的ctypes库
2.3.2.可以直接拿已经注册好的大漠插件,乐玩插件等com组件进行调用
2.3.3.python语法精炼,编写程序很快,至于开发gui方面,比起易语言稍微逊色,但是你可能听说过pyqt?其实说老实话,pyqt不是python自带的,而且学习成本高,编译的exe还那么臃肿,不是很好的选择。在游戏脚本编程方面,以及任何小工具方面,只要不追求美观,通通用tkinter来实现吧!
3.python3文件内加入附件的思路:
首先选择附件,将附件编码成特定的字符串,这里示例程序编码规则为filecode@文件名@文件后缀=二进制文件字符串
因为这是字符串,可以直接放在py文件里面,发布的时候用pyinstaller一块儿打包
释放附件:传入附件字符串参数,自动根据附近字符串解析附件名称,类型,询问保存路径,然后以二进制方式新建一个对应的文件并把解码后的二进制数据写入该文件
如果是临时文件,可以在写入完成后进行自定义延时删除。
4.python资源储存的扩展:
可以通过此方式,用mqtt协议进行文件资源传输。扩展项目:基于mqtt协议的小型QQ,支持文字聊天私聊,群聊,文件传输,保存,转发。
5.核心代码部分:
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# File : 资源无损编码储存.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date : 2019/6/2
import base64
from tkinter.filedialog import *
from tkinter.messagebox import *
from os import remove
from time import sleep
def get_filePath_fileName_fileExt(fileUrl):#获取文件上级目录,文件名称,文件后缀
filepath, tmpfilename = os.path.split(fileUrl)
shotname, extension = os.path.splitext(tmpfilename)
return filepath, shotname, extension
def btn_savefiles(filecode=""):
if filecode.startswith("filecode"):
filetend = filecode.split('"')[0].split("@")[2].replace("=","").replace(" ","")
filename = filecode.split('"')[0].split("@")[1]
filecontent = filecode.split(" ")[2]
savepath = asksaveasfilename(defaultextension=".%s" % filetend, filetypes=[("file", ".%s" % filetend)],initialfile="%s.%s" %(filename,filetend), title="选择路径并设置你要保存的文件名")
if savepath!="":
tmp = open(savepath, "wb+")
content = base64.b64decode(filecontent)
tmp.write(content)
tmp.close()
return savepath
else:
showerror("错误","没有传入可写的二进制文件数据!")
def btn_selectfile():
fpath = askopenfilename()
if fpath!="":
_ ,fname,tp1=get_filePath_fileName_fileExt(fpath)
form = tp1[1:]
print(form)#打印文件类型
open_file = open(fpath, "rb")
b64str = base64.b64encode(open_file.read())
open_file.close()
sendfile = 'filecode@%s@%s = "%s"'%(fname,form,b64str)
sendfile = sendfile.replace("b'","").replace("'","")
f = open("file.txt", "w+")
f.write(sendfile)
f.close()
return sendfile
def btn_delete(filepath,detime=1):#待删除的文件路径,延时删除秒数
if filepath!="":
sleep(detime)
remove(filepath)
if __name__ == '__main__':
file_code = btn_selectfile()
print(file_code)
a = btn_savefiles(file_code)
btn_delete(a,5)