由于网上只讲述原理的文章太多,怎么使用的文章太少,所以本人文章只负责展示效果及代码注释,不着重讲解原理
有没有被pyinstaller打包折磨的死去活来?有没有苦恼于pyinstaller打出的包是一个很大的exe文件,而其他打包库又不熟练?有没有想过只需一个按钮就能把python代码打包成exe?有没有羡慕打包的exe文件像主流软件一样有很多依赖项看起来很高大上?还在各种查询如何python代码打包后没有cmd黑框?
说在前面,请仔细阅读:
1.本EXE打包器打包你自己的代码时,请注意:如果GUI编程使用的是tkinter或者本文封装的tkinter,打包后可以正常运行,其他库正在研究配置如QT等。
2.打包前,请仔细运行你的python代码,打包后出现问题根据我多年的经验一般是代码漏洞。
3.若使用kivy库编写的GUI,请确保电脑中已正确安装kivy库文件。
4.打包时,请在软件上点击右侧切换使用的GUI库,配置正确的GUI
5.若未使用任何的GUI库,请选择默认的tkinter系列,因为kivy系列需要安装kivy库才能正常运行
那么这篇文章将解决你上述已经其他的疑惑,本文使用Python tkinter pyinstaller构建了一种EXE打包器
软件。使用python构建代码,配合自定义封装的tkinter库实现GUI界面,并利用 pyinstaller实现exe打包功能。那么开始展示EXE打包器软件项目,软件界面如下:
本文使用自定义封装的tkinter库实现GUI,解决python在GUI方面的不太友好性。废话不多说,先上代码,点击获取Headerfile
from Headerfile import *
class Python代码EXE打包器():
def __init__(self):
##参数分别为窗口名称、宽度、高度、背景颜色、ico图标文件(为''表示无)
self.根窗体 = MainWindows('Python代码EXE打包器',865,300,'green','')
if __name__ == '__main__':
Python代码EXE打包器().根窗体.MainWindows.mainloop()
在建立的根窗口上定义GUI的变量并添加控件:
点击获取Headerfile
from Headerfile import *
class Python代码EXE打包器():
def __init__(self):
self.根窗体 = MainWindows('Python代码EXE打包器',865,300,'green','图标.ico')
self.initvariable()
self.initweight()
def initvariable(self):
###定义GUI的string类型变量,参数为初始化的值
self.mainpy文件路径 = InitStringVariable('')
self.mainpy文件夹 = InitStringVariable('')
self.main文件名称 = InitStringVariable('')
self.ico图标名称 = InitStringVariable('')
self.输出文件夹 = InitStringVariable('')
self.打包后文件名 = InitStringVariable('')
self.生成exe名称 = InitStringVariable('')
self.文件所在的盘 = InitStringVariable('')
###定义GUI的int类型变量,参数为初始化的值
self.状态切换变量 = InitIntVariable(0)
def initweight(self):
##定时器函数,参数分别为定时时间(ms),是否循环定时,定时到执行的函数,执行函数的参数(列表形式)##
ClockTime(500,True,self.定时函数,[])
##标题控件,参数分别为放置的窗体,[行,列,跨行数,跨列数],内容,字体大小,[背景颜色,字体颜色]##
TitleView(self.根窗体,[0,0,1,2],'python代码EXE打包器',40,['green','white'])
##路径选择控件,参数分别为放置的窗体,[行,列,跨行数,跨列数],控件名称,绑定的变量,字体大小,宽度,背景颜色##
PathChooseView(self.根窗体,[1,0,1,2],'main.py路径:',self.mainpy文件路径,20,25,'darkturquoise')
##名称数据显示控件, 参数分别为放置的窗体,[行,列,跨行数,跨列数],控件名称,绑定的变量,字体大小,宽度,背景颜色##
NameDataView(self.根窗体,[2,0,1,1],'main.py文件夹',self.mainpy文件夹,15,25,'deepskyblue')
NameDataView(self.根窗体,[3,0,1,1],'main文件名称',self.main文件名称,15,25,'deepskyblue')
NameDataView(self.根窗体,[3,1,1,1],'ico图标名称',self.ico图标名称,15,25,'deepskyblue')
NameDataView(self.根窗体,[4,0,1,1],'输出文件夹路径',self.输出文件夹,15,25,'dodgerblue')
##多状态切换控件, 参数分别为放置的窗体,[行,列,跨行数,跨列数],控件名称,状态名称列表,状态数组变量,字体大小,背景颜色
MultiStatuSwitch(self.根窗体,[4,1,1,1],'点击右侧切换使用的GUI库',['tkinter系列','kivy系列'],self.状态切换变量,15,'dodgerblue')
NameDataView(self.根窗体,[5,0,1,1],'打包后文件夹名',self.打包后文件名,15,25,'dodgerblue')
NameDataView(self.根窗体,[5,1,1,1],'生成exe名称',self.生成exe名称,15,25,'dodgerblue')
##按钮控件,参数分别为放置的窗体,[行,列,跨行数,跨列数],控件名称,字体大小,背景颜色,执行函数,执行函数的参数(列表形式)##
ButtonsView(self.根窗体,[6,0,1,2],'开始生成',20,'lightpink',self.打包生成,[])
def 定时函数(self,参数):
pass
def 打包生成(self,参数):
pass
if __name__ == '__main__':
Python代码EXE打包器().根窗体.MainWindows.mainloop()
本封装库有一个功能,控件可跟随窗口大小的变化重新布局:
例如,将主窗口的宽度拖小,由于主窗口太小,且控件有字体大小限制,所以将显示不全
若将主窗口最大化:
或者向下拖拽:
(1)例如:打包一个简单的python代码,你需要做以下工作:
1.新建一个两级的文件夹,名字随便起,但不要太诡异!
2.将你的main.py(就是py代码的主函数所在的文件移入程序文件夹),以及你自己调用的文件,说白了就是把你原来的整个项目粘贴进去就行了
3.将的主函数所在的文件命名为main.py
或者main.pyw
,这个是必须的,因为为规范软件搜寻的main文件,强制使用者为主函数所在的文件命名。
import tkinter as tk
class 一个GUI界面类():
def __init__(self,模块):
##通过初始化传参声明一个tkinter
self.界面GUI = 模块
##设置窗口标题
self.界面GUI.title('打包测试')
##设置窗口大小
self.界面GUI.geometry("560x450")
##设置固定窗口大小,不能拖拽改变
self.界面GUI.resizable(0,0)
##设置窗口背景颜色,如想改变颜色,可百度搜索tkinter背景颜色
self.界面GUI.config(bg='Beige')
if __name__ == "__main__":
##声明一个tkinter
root = tk.Tk()
##建立类
一个GUI界面类(root)
##消息循环,并保持窗口存在
root.mainloop()
此时双击main.py运行是有cmd命令框的存在的
(2)现在启动软件,选择main.py所在的路径:
程序会自动生成打包后的文件夹名,以及生成exe的名称,这两个都来源于你的第二级文件夹名称,若想更改,请事先将第二级文件夹名字想好,还会自动搜索你选择路径下的main.py,以及ico图标名称(为空则使用python默认的图标)
(3)点击生成按钮
,等待生成完毕,打包使用的是pyinstaller,若打包后的exe运行报错,还请仔细检查的python代码运行时你自定义的东西(文件、文件夹等),在打包后的文件夹中是否存在。
(4)点击打开exe文件夹
,可用看到EXE打包器已成功将打包后exe所需的依赖项打包进来
(5)双击exe运行,与python代码的运行的结果相同,只是没有了cmd窗口
(1)以简单的kivy代码为例,代码如下:
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.uix.label import Label
from kivy.core.window import Window
from kivy.utils import get_color_from_hex
class 布局器(StackLayout):
def __init__(self,**kwargs):
super().__init__(**kwargs)
self.add_widget(Label(text = 'HHHHHH',font_size = 50))
class 计算器(App):
def build(self):
Window.clearcolor = get_color_from_hex('#66CDAA')
return 布局器()
if __name__ == '__main__':
计算器().run()
(2)启动软件,选择main.py路径,并切换使用的GUI库
(3)点击生成按钮
,等待生成完毕
(4)双击exe运行,与python代码的运行的结果相同
本文实现了一种Python tkinter pyinstaller的EXE打包器,用于生成EXE文件及其依赖文件,完整的代码请浏览Python-tkinter-pyinstaller项目之EXE打包器(代码展示版),或者直接下载安装包使用安装包链接