Tkinter编写带GUI的小软件+pyinstaller打包踩坑全流程(win10+python3.7)

您所在的位置:网站首页 pyinstaller打包报错 Tkinter编写带GUI的小软件+pyinstaller打包踩坑全流程(win10+python3.7)

Tkinter编写带GUI的小软件+pyinstaller打包踩坑全流程(win10+python3.7)

2023-12-31 05:30| 来源: 网络整理| 查看: 265

Tkinter编写带GUI的小软件+pyinstaller打包踩坑全流程 - win10 1. Tkinter1.1 使用Tkinter的准备1.2 完整程序样例(tkinter的使用等不赘述) 2. 虚拟环境与pyinstaller打包2.1 为何要用虚拟环境2.2 虚拟环境的几种工具和实现方式virtualenvvenvpipenv(本文采用)Anaconda自带的虚拟环境创建 2.3 Pipenv的使用pipenv的基本命令:正式操作:1. 安装2. 创建虚拟环境3. 虚拟环境中安装所需的包4. 使用pyinstaller打包exe 2.4 打包效果非虚拟环境直接打包/conda打包等:pipenv打包(最终使用版):UPX进一步压缩(又小了些,但仍有bug待解决):

1. Tkinter

关于Python的GUI编程,最初级最简洁的工具肯定是tkinter了。 Tkinter (Tk接口)是 Python 的标准 GUI 库,无需另外安装。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

使用Python写的带有GUI的小工具,想要打包成exe文件,发布给不懂python的人直接使用怎么办呢?本文介绍了把tkinter编写的简单的含有GUI的py文件打包成exe的全部踩坑过程。

1.1 使用Tkinter的准备

首先导入所需要的库。这里注意第一个坑: tkinter的一些子模块,一定要显式导入才行,比方tkinter.messagebox这个就要单独导入,若只导入tkinter而不显式导入一些子模块,经测试打包成exe后的弹窗等功能会失效。

正确:

import tkinter import tkinter.messagebox import tkinter.filedialog import os import pandas as pd

错误:

import tkinter import os import pandas as pd 1.2 完整程序样例(tkinter的使用等不赘述) # -*- coding: utf-8 -*- """ Created on Fri Jan 8 15:55:22 2021 @author: wangy 功能说明:读取excel文件中的员工工号,并从指定文件夹中删除这些特定工号后缀的员工照片文件 """ import pandas as pd import os import tkinter.filedialog import tkinter.messagebox import tkinter pathlist = {'p1':'','p2':''} # 存放excel文件和图片文件夹的路径 def selectPath(): # 选择excel文件路径的函数 filepath = tkinter.filedialog.askopenfilename() path.set(filepath) pathlist['p1'] = filepath def selectPath2(): # 选择照片存放文件夹路径的函数 folderpath = tkinter.filedialog.askdirectory() path2.set(folderpath) pathlist['p2'] = folderpath def photo_delete(): # 实现照片删除功能的函数 show.delete(1.0, tkinter.END) excel1 = pd.read_excel(pathlist['p1'],converters={'姓名':str,'工号':str}) # 读取excel # show.insert(tkinter.END, excel1.iloc[1,1]) ID_to_be_del = excel1['工号'].tolist() file_list = os.listdir(pathlist['p2']) for a,i in enumerate(file_list): try: ID = i[i.index('_')+1:i.index('.')] show.insert(tkinter.END, ID) message_ = i + ' deleted...\n' if ID in ID_to_be_del: # print('Yes, Del it') path_ = pathlist['p2'] + '/' + file_list[a] os.remove(path_) show.insert(tkinter.END, message_) else: # print('No, not this') pass except: pass show.insert(tkinter.END, 'Completed!') def message(): # 弹出对话框确认删除的函数 r1 = tkinter.messagebox.askokcancel('OOOH', 'Are you sure to delete these photos?') if r1: photo_delete() else: pass root = tkinter.Tk() path = tkinter.StringVar() path2 = tkinter.StringVar() root.geometry('460x240') root.resizable(0,0) # 固定窗口大小 root.title('Photo deleter v1.0 by WYY') lb1 = tkinter.Label(root,text = "Excel path:") lb1.place(relx=0.02, rely=0.05, relwidth=0.15, relheight=0.1) inp1 = tkinter.Entry(root, textvariable = path) inp1.place(relx=0.18, rely=0.05, relwidth=0.6, relheight=0.1) bt1 = tkinter.Button(root, text = "Select", command = selectPath) bt1.place(relx=0.82, rely=0.05, relwidth=0.15, relheight=0.1) lb2 = tkinter.Label(root,text = "Photo path:") lb2.place(relx=0.02, rely=0.20, relwidth=0.15, relheight=0.1) inp2 = tkinter.Entry(root, textvariable = path2) inp2.place(relx=0.18, rely=0.20, relwidth=0.6, relheight=0.1) bt2 = tkinter.Button(root, text = "Select", command = selectPath2) bt2.place(relx=0.82, rely=0.20, relwidth=0.15, relheight=0.1) bt3 = tkinter.Button(root, text="GO!", command = message) bt3.place(relx=0.4, rely=0.35, relwidth=0.2, relheight=0.1) # 创建文本框用来显示信息 show = tkinter.Text(root) show.place(y=120, height = 200) root.mainloop()

运行此.py文件后,GUI效果: 在这里插入图片描述

2. 虚拟环境与pyinstaller打包 2.1 为何要用虚拟环境

初识python的时候,大家肯定都会不以为意,弄虚拟环境干嘛?装一个最新版的python发行版,想要啥库就往里堆不就好了,简单便捷。但随着你的需求不断增加,会涉及到同时开发多个不同的项目,涉及到包库的不同版本的管理,肯定不会每次都先pip uninstall再安装其他版本,这时候创建一个新的环境,适配你特定的项目对包的版本需求就很重要啦。

本文中,在使用pyinstaller打包时,使用虚拟环境的必要性在于,创建一个纯净的没有多余包库的新环境,可以大幅度减少打包时长、优化exe文件体积和增加软件运行速度。

2.2 虚拟环境的几种工具和实现方式 virtualenv

virtualenv 是目前最流行的 Python 虚拟环境配置工具。它不仅同时支持 Python2 和 Python3,而且可以为每个虚拟环境指定 Python 解释器,并选择不继承基础版本的包。

venv

Python 从3.3 版本开始,自带了一个虚拟环境 venv,在 PEP-405 中可以看到它的详细介绍。它的很多操作都和 virtualenv 类似,但是两者运行机制不同。因为是从 3.3 版本开始自带的,这个工具也仅仅支持 python 3.3 和以后版本。所以,要在 python2 上使用虚拟环境,依然要利用 virtualenv 。

pipenv(本文采用)

pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv,能够有效管理Python多个环境,各种第三方包及模块。

pipenv有以下优点: 1. pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷。 2. 过去用virtualenv管理requirements.txt文件可能会有问题,Pipenv使用Pipfile和Pipfile.lock, 后者存放软件包的依赖关系,查看依赖关系时十分方便。 3. 各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。 4. 通过加载.env文件简化开发工作流程。 5. 支持Python2 和 Python3,在各个平台的命令都是一样的。

更多三者比较请查看:一文解读 virtualenv & venv & pipenv 之间的联系与区别

因此,本文主要使用pipenv进行虚拟环境的创建和后续打包工作

Anaconda自带的虚拟环境创建

Anaconda是一个很常用的开源Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda 的下载文件比较大。 Anaconda也自带了比较方便的环境管理工具。打开Anaconda prompt(类似cmd): conda create --name your_name python=X.X conda activate 即可创建并激活进入新的环境。 但anaconda包含了大量冗余的包库,对于exe的打包并不友好,会造成exe文件极其庞大,故本文并不用此环境来进行后续打包工作。

2.3 Pipenv的使用 pipenv的基本命令: pipenv install 创建虚拟环境 pipenv shell    进入虚拟环境(如果不存在,则创建并进入虚拟环境) pipenv install flask   安装模块 pipenv uninstall flask 卸载模块 pipenv graph      查看模块之间的依赖关系 pip list         查看虚拟环境所有模块 exit()          退出虚拟环境 pip freeze > requirements.txt     导出虚拟环境所有依赖包名 pip install -r requirements.txt     安装项目所依赖全部模块 正式操作: 1. 安装

首先点击键盘的“win”,输入cmd,进入命令提示符,执行以下安装命令: pip install pipenv或pip3 install pipenv(取决于你的pip版本)

2. 创建虚拟环境

pipenv install

此处第二个坑:此处如果提示以下错误:

C:\WINDOWS\system32>pipenv install Creating a virtualenv for this project... Pipfile: C:\WINDOWS\system32\Pipfile Using C:/Users/wangy/AppData/Local/Programs/Python/Python37/python.exe (3.7.1) to create virtualenv... [ ] Creating virtual environment...FileNotFoundError: [Errno 2] No such file or directory: 'c:\\users\\wangy\\appdata\\local\\programs\\python\\python37\\Lib\\venv\\scripts\\nt\\python.exe' Failed creating virtual environment [pipenv.exceptions.VirtualenvCreationException]: Failed to create virtual environment.

按照提示,把C:/Users/你的用户名/AppData/Local/Programs/Python/Python37/python.exe放入c:\users\你的用户名\appdata\local\programs\python\python37\Lib\venv\scripts\nt\中即可 若继续提示缺少pythonw.exe,则按照报错信息,到与刚刚的python.exe相同的文件夹把pythonw.exe也按要求复制进目标路径即可。 看到如下提示,则为创建成功 在这里插入图片描述 然后,使用pipenv shell进入此虚拟环境 在这里插入图片描述

3. 虚拟环境中安装所需的包

pip install pandas pip install pyinstaller(别忘了把pyinstaller也安装了,否则不会调用虚拟环境的pyinstaller) 此处第三个坑。由于国内的网络问题,安装小点的几百K的包是没问题的,但Pandas有10M左右,经常没速度或者中断,令人很是苦恼。 若速度太慢,可临时换源: pip3 install pandas -i https://pypi.douban.com/simple 更多换源参考: pip cmd下换源 一举解决Anaconda换源难题

这里注意,第四个坑,需要打包的py代码中如果含有Pandas库,我们需要额外安装xlrd这个库,否则打包后的exe文件看似正常执行,但Pandas包的读取excel文件等功能不生效 pip install xlrd 而且,如果需要读取的文件是xlsx格式,不是xls格式,xlrd的最新版2.0还不能用,需要卸载掉重装: pip uninstall xlrd 然后安装老版本: pip install xlrd==1.2.0

4. 使用pyinstaller打包exe

终于到了打包的一步。 执行以下命令: pyinstaller -F -w C:\pythontest1\Photo_del\pack\photo_del_GUI.py --distpath=C:\pythontest1\Photo_del\pack\ -i C:\pythontest1\Photo_del\pack\icon2.ico 其中: -F为打包成一个单独exe文件 -w为去掉黑色的控制台(第五个坑:建议可以先输出一个不去掉控制台的exe,便于调试各种bug,没问题后再输出-w的exe。当你的exe可以正常输出但功能出了问题时,控制台就很有用,例如前文的Pandas缺少xlrd就是控制台给出的debug重要信息) C:\pythontest1\Photo_del\pack\photo_del_GUI.py为你要打包的py文件的路径 --distpath=后面的为输出exe的目标路径 -i C:\pythontest1\Photo_del\pack\icon2.ico为exe图标的ico文件路径(可省略)

(其实如果想进一步压缩,还可以使用UPX工具进行压缩,在 --upx-dir=C:\pythontest1\Photo_del\upx-3.95-win64\upx-3.95-win64\,其中所指定的路径为upx.exe的路径,下载链接:下载链接 但本人卡在了第六个坑,用UPX打包出来的exe文件报缺少dll等问题,因时间关系没有进一步深究,有兴趣的小伙伴可以自行研究一下。)

2.4 打包效果 非虚拟环境直接打包/conda打包等:

在这里插入图片描述

pipenv打包(最终使用版):

在这里插入图片描述

UPX进一步压缩(又小了些,但仍有bug待解决):

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3