硬编码tkinter的图标而不依赖于外部文件(不生成临时图标文件)

因为利用tkinter库一般都是做GUI的,所以完成的产品都希望能够打包发布。但是利用pyinstaller打包发布后,图标文件是没有包含的。虽然也可以通过修改pyinstaller的参数的方式将图标文件封装进去,但是这里采用一种更直接的方式:直接将图片编码在源代码中。

网上有的博客教的,需要生成临时的图标文件再删去,我觉得这样非常不优雅。所以这里我不会采用这种方法。

tkinter的默认图标(一个小羽毛):

在这里插入图片描述 


一般的更换图标的方法
我们先保存一个icon.ico的图标文件。文件如图:

在这里插入图片描述 

黑色为透明色。接着我们要把tkinter的默认图标从羽毛改成这个。

一般的方法是通过iconbitmap方法实现的。话不多说,直接上代码:

import tkinter as tk

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')
window.iconbitmap('icon.ico')
hello = tk.Label(window, text='Hello! This is Tkinter!', bg='#66ccff', font=('Arial', 12), width=30, height=2)
hello.pack()
window.mainloop()


这是一段简单的tkinter程序。运行结果如下:

在这里插入图片描述 

可以看到已经成功了。但是如果用pyinstaller打包,生成的exe文件并不会包含这个外部图标文件。怎么办呢?于是我们想到把图标信息直接编码到源代码中!

将图标编码到源码中
图片本质上还是字节数据。因此,只要将图片的二进制数据读出来,然后再解码就可以了。因此,只要在源代码中硬编码上图标文件的二进制数据即可。

分两步走。

第一步:获取图标二进制数据
使用以下代码:

import base64

with open('icon.ico', 'rb') as open_icon:
    b64str = base64.b64encode(open_icon.read())
    print(b64str)


输出的字符串即为图标文件的二进制数据。我假设输出为b'abcdefg'。

第二步:更换tkinter的图标
利用上面获取的二进制数据,我们可以编写出如下代码:

import tkinter as tk
from PIL import ImageTk        # pip install --upgrade Pillow
from base64 import b64decode

window = tk.Tk()
window.title('My Window')
window.geometry('500x300')
# window.iconbitmap('icon.ico')
icon_img = b'abcdefg'   # 这里替换成你自己图标文件的二进制数据
icon_img = b64decode(icon_img)
icon_img = ImageTk.PhotoImage(data=icon_img)
window.tk.call('wm', 'iconphoto', window._w, icon_img)
hello = tk.Label(window, text='Hello! This is Tkinter!', bg='#66ccff', font=('Arial', 12), width=30, height=2)
hello.pack()
window.mainloop()


效果:

在这里插入图片描述 

可以看到效果是一样的!我们这样就完成了图标文件的硬编码,而不再依赖于外部的图标文件了!也没有像有的博客教的,生成临时的图标文件! 这样我们就可以非常方便地利用pyinstaller进行打包了!

Guess you like

Origin blog.csdn.net/Gordennizaicunzai/article/details/121721528