Python - Tkinter

环境准备

建议在开始尝试 Tkinter 的时候先创建一个虚拟环境进行测试,首先先用 Conda 创建一个虚拟环境:

1
conda create --name <name of your environment> python=3.8

其中 python=3.8 是可选项,也可以指定下载其他的 Python 版本。

然后激活环境:

1
conda activate <name of your environment>

安装 Pip ,因为有些包不能通过 Conda 安装,而这个时候就需要使用 Pip,这里要注意一个点,要首先激活 Conda 的环境,然后在激活的虚拟环境中再通过 Conda 重新下载一个 Pip[1],否则这时的虚拟环境中是不存在 Pip 的,所以如果直接执行 Pip 的命令会对原本的环境生效。

1
conda install pip

这个时候通过查看 Conda 和 Pip 的环境可以查看是不是在虚拟环境中:

1
2
conda list
pip list

如果结果和原本环境中的输出是不一样的,那么就是成功创建虚拟环境并且激活虚拟环境了。

Tkinter 是什么[2]

tkinterPython 标准的GUI库,可以使用这个库快速地创建GUI应用。

如何将 Python 文件编译成 .exe 文件[3]

  1. 安装编译工具 pyinstaller

    1
    pip install pyinstaller
  2. 在文件路径下执行编译命令,其中 -w 参数是为了使得 dos 窗口不会随着 tkinter 窗口出现

    1
    pyinstaller -F -w demo.py #demo.py是待编译的代码文件名
  3. 编译完成后一般会在当前文件夹中生成一个 dist 的文件夹,一个 build 文件夹和 一个 demo.spec 文件,编译后的 .exe 文件就在 dist 文件夹中。

编译后 .exe 文件太大的问题

原因是在编译时会把 Python 环境及库一起打包到 .exe 文件中,如果当前的 Python 环境中安装了很多的包,那么就会把所有的库带上,导致编译后的 .exe 文件过大。

因此解决方案就是为该文件单独创建相应的 Python 虚拟环境,只安装要编译 Python 文件所依赖的库。具体步骤如下:

  1. 安装 virtualenv 用于创建虚拟环境

    1
    pip install virtualenv
  2. 创建一个虚拟环境,建议将这个虚拟环境放在需要打包的 Python 文件夹中,便于后面的处理

    1
    virtualenv py3exe_env #自定义命名虚拟环境的名称,这里是py3exe_env
  3. 创建完成之后进入到该目录

    1
    cd py3exe_env/Script
  4. 在该目录下找到 activate.ps1 并执行

    1
    activate.ps1
  5. 然后在该虚拟环境下安装要编译的文件需要依赖的 Python 库,当然也要重新安装 pyinstaller

    1
    2
    pip install pyinstaller
    pip install conda #比如这里安装conda
  6. 然后在该虚拟环境中回到要编译的文件目录下输入编译命令:

    1
    pyinstaller -F -w test.py #运行时不出现dos命令窗口

如何给 Tkinter 添加自定义图标

首先将要设置为图标的图片转换成 .ico 的格式,很多在线网站都能实现[4]。然后在运行 pyinstaller 之前给它加上一个参数[5]

1
pyinstaller -F -w --icon=<file name>.ico test.py #运行时不出现dos命令窗口

比如你的 .ico 文件是 icon.ico 那么完整命令应该是:

1
pyinstaller -F -w --icon=icon.ico test.py #运行时不出现dos命令窗口

还有一种方法是利用 Tkinter 的方法[6]

1
2
3
4
5
6
7
8
9
10
11
12
13
import tkinter as tk

# 创建主窗口
window = tk.Tk()
window.title("我的应用程序")

# 设置图标
window.iconbitmap("icon.ico") # 把 icon.ico 文件名改成你的文件名

# 修改任务栏图标
window.wm_iconbitmap("icon.ico") # 这里也要改

window.mainloop()

还有一种方法是将图标硬编码进代码中[7],首先获取图标的二进制数据:

1
2
3
4
5
import base64

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

输出的字符串即为图标文件的二进制数据。假设输出为b'abcdefg'。然后利用获取的二进制数据,可以写出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

window.mainloop()

这里注意一个点,PIL 已经不再维护了,所以需要 pip install Pillow,接口的代码是一样的。

Tkinter 快速入门

Tkinter 实战

用 Tkinter 实现了一个博客管理器,主要用于管理我自己的博客文章,源代码和程序仓库请点我

References


Python - Tkinter
https://chen-huaneng.github.io/2024/03/29/2024-3-29-2024-03-29-Python-tkinter/
作者
Abel
发布于
2024年3月29日
更新于
2024年10月30日
许可协议