一种使用pyinstaller时图标问题解决方案

0x00 场景

  使用pyinstaller将.py文件编译成.exe文件时,想要使用自己心仪的图标(.ico)比较麻烦。在使用pyinstaller时,用参数:--icon可以给生成的可执行文件设定自定义图标,但这只是给程序一个图标,而在程序开启后,窗口右上角的图标却依旧是默认的tk图标(羽毛)。

  如果想要在脚本中直接函数iconbitmap('图标路径')来设定窗口左上角图标,虽然使用python编译器可以正确呈现自定义的图标,但是用pyinstaller编译成.exe文件之后,程序窗口可能组件呈现不出来或者干脆程序无法执行。

  下面给出一种解决方案,可以有效又方便的解决程序内图标无效的问题。

0x01 解决方案

Step 1 将图标文件写在类中

准备:一个图标文件pen.ico

  图标文件同目录下首先创建一个py文件,源码如下:

import base64
with open("icon.py","a") as f:
f.write('class Icon(object):\n')
f.write('\tdef __init__(self):\n')
f.write("\t\tself.img='")
with open("pen.ico","rb") as i:
b64str = base64.b64encode(i.read())
with open("icon.py","ab+") as f:
f.write(b64str)
with open("icon.py","a") as f:
f.write("'")

  此时,在同文件夹下产生一个icon.py的模块。把它保存在类当中是为了让我们要编译的py能够创建并调用之。

Step 2 从在类中读出图标文件

  在我们要编译成可执行文件的脚本中,用

from icon import Icon
with open('tmp.ico','wb') as tmp:
tmp.write(base64.b64decode(Icon().img))
root.iconbitmap('tmp.ico')
os.remove('tmp.ico')

代替脚本中类似下面这样的语句

root.iconbitmap('pen.ico')

0x03 总结

  经过如上两步,就能在使用pyinstaller编译后正确的呈现自定义图标而且程序能够正常工作了。这种将文件在开发阶段编码后编译在可执行文件,到了程序运行的时候自动生成的方法也能够用到产生程序其他必要的文件中。

0x04 参考文献

  1. lion_cui. Pyinstaller 打包 Tkinter 程序时引入图标解决方法[EB/OL]. http://blog.csdn.net/lion_cui/article/details/51329497.

一种使用pyinstaller时图标问题解决方案的更多相关文章

  1. .net 项目 调用webservice 出错,异常信息:对操作“xxx”的回复消息正文进行反序列化时出错。解决方案。

    项目运行好好的,增加并更新WebService后,出错,捕获异常信息为:对操作“xxx”的回复消息正文进行反序列化时出错.解决方案. 认真分析异常信息后,得到关键提醒: {"读取 XML 数 ...

  2. 打开Office2007弹出“向程序发送命令时出现问题” 解决方案

    打开Office2007弹出“向程序发送命令时出现问题” 解决方案,试了很多方案,最终还是这种方法帮我解决了问题,分享下,以下地址便是: http://club.excelhome.net/threa ...

  3. 编译chromium时下载gn.exe时出错的解决方案

    天朝人写个代码真难,想要编译一下chromium,但是获取代码时各种坑,不是网速慢,就是网络联不通,真难玩. 本文针对下载gn.exe等工具时失败的解决方案. 原因1:gclient没有走代理,针对使 ...

  4. vue 在有大数据量的 table 中使用弹窗 input 输入数据时卡顿解决方案

    vue 在有大数据量的 table 中使用弹窗 input 输入数据时卡顿解决方案 原因:vue在进行输入时,进行了多次的render刷新渲染操作,导致了input框输入时发生的卡顿现象 解决方法:在 ...

  5. pyinstaller设置图标出现“struct.error: unpack requires a buffer of 16 bytes”

    pyinstaller设置图标出现"struct.error: unpack requires a buffer of 16 bytes" 直接用png图片改后缀名为ico,然后p ...

  6. 一种更优雅的Flutter Dialog解决方案

    前言 系统自带的Dialog实际上就是Push了一个新页面,这样存在很多好处,但是也存在一些很难解决的问题 必须传BuildContext loading弹窗一般都封装在网络框架中,多传个contex ...

  7. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()

    问题描述 iOS系统下,移动web页面,inpu获取焦点弹出系统虚拟键盘时,偶尔会出现挡住input的情况,尽管概率不大,但是十分影响用户体验. 问题重现 原始页面:页面中有header.main.f ...

  8. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案

    问题描述 iOS系统下,移动web页面,inpu获取焦点弹出系统虚拟键盘时,偶尔会出现挡住input的情况,尽管概率不大,但是十分影响用户体验. 问题重现 原始页面:页面中有header.main.f ...

  9. Android中使用ViewGroup.removeViews()时出现NullPointException解决方案

    在ViewGroup的内部写一个动画效果,在效果结束之后会调用onAnimationEnd(Animation arg0),在此方法中如果直接使用removeViews()时,可能会出现NullPoi ...

随机推荐

  1. Pytorch中的squeeze()和unsqueeze()函数

    在numpy库中,经常会出现“秩为1的一维数组”(come from 吴恩达的深度学习,目前还没有搞清楚numpy中如此设计的意图).比如: 注意这里的a的shape是[3] ,既不是 [1,3] 也 ...

  2. kan

    http://blog.csdn.net/yahohi/article/details/7427724 http://duanhengbin.iteye.com/blog/1706635 http:/ ...

  3. cdh部署

    supermicro安装环境 本次安装基于无因特网的环境,共安装2个节点(一个master节点,一个data及节点),所用系统为centos7.x,所有安装过程均使用root用户.具体的节点信息如下: ...

  4. Informatic学习总结_day01

    1.forlder 必须open之后才出现  mapping的界面 2.Source Qualifer 3.小技巧 验证自己写的转换格式是否正确 提前过滤一些数据,informatica工具的本质也是 ...

  5. MySQL— 基础

    目录 一.MySQL概述 二.下载安装 三.数据库操作 四.数据表操作 五.表内容操作 一.MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracl ...

  6. IAR各个历史版本的下载地址

    http://supp.iar.com/Updates/?product=EWarm 点击进入上述链接,拉到最底部,点击old version即可见到所有的历史版本!!!

  7. scrapy通过修改配置文件发送状态邮件

    EXTENSIONS = {    'scrapy.extensions.statsmailer.StatsMailer': 500,} STATSMAILER_RCPTS = ['159882826 ...

  8. C++:explicit关键字

    在C++中,如果一个类的构造函数只有一个形参,在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据转换为类的对象, ...

  9. jenkins jar包上传maven仓库

    1      Jenkins 编译后部署至 Maven 仓库 jenkins编译后构件(如:jar包)部署至maven仓库需修改以下内容:maven 仓库配置:项目 pom 文件:本地仓库的 sett ...

  10. CentOS切换为iptables防火墙并进行相关配置

    CentOS切换为iptables防火墙 切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务. 1.关闭firewall: service firewalld s ...