由于网上只讲述原理的文章太多,怎么使用的文章太少,所以本人文章只负责展示效果及代码注释,不着重讲解原理

Python-tkinter-pyinstaller项目之EXE打包器

  • 一、前言
  • 二、建立根窗口
  • 三、添加控件
  • 四、封装tkinterGUI的python代码展示
  • 五、封装kivyGUI的python代码展示
  • 总结



一、前言

有没有被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打包器软件项目,软件界面如下:

tkinterdesigner打包apk tkinter打包成exe_python程序打包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()

tkinterdesigner打包apk tkinter打包成exe_tkinter_02

三、添加控件

在建立的根窗口上定义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()

tkinterdesigner打包apk tkinter打包成exe_exe_03

本封装库有一个功能,控件可跟随窗口大小的变化重新布局:

例如,将主窗口的宽度拖小,由于主窗口太小,且控件有字体大小限制,所以将显示不全

tkinterdesigner打包apk tkinter打包成exe_tkinter_04


若将主窗口最大化:

tkinterdesigner打包apk tkinter打包成exe_tkinter_05


或者向下拖拽:

tkinterdesigner打包apk tkinter打包成exe_pyinstaller_06

四、封装tkinterGUI的python代码展示

(1)例如:打包一个简单的python代码,你需要做以下工作:

1.新建一个两级的文件夹,名字随便起,但不要太诡异!

2.将你的main.py(就是py代码的主函数所在的文件移入程序文件夹),以及你自己调用的文件,说白了就是把你原来的整个项目粘贴进去就行了

3.将的主函数所在的文件命名为main.py或者main.pyw,这个是必须的,因为为规范软件搜寻的main文件,强制使用者为主函数所在的文件命名。

tkinterdesigner打包apk tkinter打包成exe_pyinstaller_07

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命令框的存在的

tkinterdesigner打包apk tkinter打包成exe_exe_08


(2)现在启动软件,选择main.py所在的路径:

tkinterdesigner打包apk tkinter打包成exe_exe_09

程序会自动生成打包后的文件夹名,以及生成exe的名称,这两个都来源于你的第二级文件夹名称,若想更改,请事先将第二级文件夹名字想好,还会自动搜索你选择路径下的main.py,以及ico图标名称(为空则使用python默认的图标)

(3)点击生成按钮,等待生成完毕,打包使用的是pyinstaller,若打包后的exe运行报错,还请仔细检查的python代码运行时你自定义的东西(文件、文件夹等),在打包后的文件夹中是否存在。

tkinterdesigner打包apk tkinter打包成exe_tkinter_10

(4)点击打开exe文件夹,可用看到EXE打包器已成功将打包后exe所需的依赖项打包进来

tkinterdesigner打包apk tkinter打包成exe_pyinstaller_11


(5)双击exe运行,与python代码的运行的结果相同,只是没有了cmd窗口

tkinterdesigner打包apk tkinter打包成exe_exe_12

五、封装kivyGUI的python代码展示

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

tkinterdesigner打包apk tkinter打包成exe_python程序打包exe_13


(2)启动软件,选择main.py路径,并切换使用的GUI库

tkinterdesigner打包apk tkinter打包成exe_python程序打包exe_14


(3)点击生成按钮,等待生成完毕

tkinterdesigner打包apk tkinter打包成exe_tkinter_15


tkinterdesigner打包apk tkinter打包成exe_python程序打包exe_16


(4)双击exe运行,与python代码的运行的结果相同

tkinterdesigner打包apk tkinter打包成exe_tkinter_17

总结

本文实现了一种Python tkinter pyinstaller的EXE打包器,用于生成EXE文件及其依赖文件,完整的代码请浏览Python-tkinter-pyinstaller项目之EXE打包器(代码展示版),或者直接下载安装包使用安装包链接