Skip to content

Commit

Permalink
Update 2019-07-01-tkinter-unicode-issues.md
Browse files Browse the repository at this point in the history
  • Loading branch information
shenweiyan authored Nov 2, 2023
1 parent dabbfc7 commit 5bc9998
Showing 1 changed file with 51 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
---
title: Python 中 tkinter 中文乱码
title: Python 中 tkinter 源码安装使用与中文乱码
urlname: 2019-07-01-tkinter-unicode-issues
author: 章鱼猫先生
date: 2019-07-01
updated: "2023-06-09 14:43:56"
---

# 引言
## _tkinter not found

Python 3 源码编译安装,执行 `make` 过程中提示 `_tkinter not found`,如下:
```bash
$ make
......
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_tkinter
```

## 中文乱码

使用 Anaconda 3(conda 4.5.11)的 tkinter python 包(conda install -c conda-forge tk)开发 GUI 界面程序过程中,发现 UI 界面出现的中文 Unicode 乱码一直没办法解决。

Expand Down Expand Up @@ -46,21 +57,21 @@ top.mainloop()

![](https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/Fh22i487OzvY-uSXvAuFs6rEXXvu.png)

**些参考资料**
**一些参考资料**

- Python3.x 中文编码转换的问题:<https://bbs.bccn.net/thread-479560-1-1.html>
- Python 2.6 Tk 中文亂碼問題解決方法<http://blogkrogh.blogspot.com/2011/03/python-26-tk.html>
- Python 2.6 Tk 中文乱码解決方法<http://blogkrogh.blogspot.com/2011/03/python-26-tk.html>
- tkinter 乱码,pyqt4 乱码:<http://aboutweb.lofter.com/post/11743e_6f7e4a5>

上面几种方法测试后,问题依然存在。在 google 上一番搜索和来回测试之后,发现了几点信息:

- 有人说,可能是 tcl/tk 安装不完整造成的。
- tcl/tk 重装后需要对 Python 重新编译 tkinter 才能起作用。
- conda install -c conda-forge tk,虽然没有任何报错,python 中 import tkinter 也正常,但 conda 的软件安装就像一个黑盒子,无法确认 tcl/tk 是否完整安装。
- conda install -c conda-forge tk,虽然没有任何报错,python2 中 import tkinter 也正常,但 conda 的软件安装就像一个黑盒子,无法确认 tcl/tk 是否完整安装。
- python 的 PyPI 仓库中是没有 tkinter 包的,想要使用 `pip install tkinter` 卸载或者重装都是行不通的。
- 网上也有人说可以使用 `yum install python3-tk/python-tk` 解决,但对于本人来说,没用。

# 什么是 tcl, tk, tkinter
## 什么是 tcl, tk, tkinter

> The [tkinter](https://docs.python.org/3.6/library/tkinter.html#module-tkinter) package (“Tk interface”) is the standard Python interface to the Tk GUI toolkit. Both Tk and [tkinter](https://docs.python.org/3.6/library/tkinter.html#module-tkinter) are available on most Unix platforms, as well as on Windows systems. (Tk itself is not part of Python; it is maintained at ActiveState.)
>
Expand All @@ -78,16 +89,16 @@ tkinter 包("Tk 接口")是 Tk GUI 工具包的标准 Python 接口。 Tk

![](https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FrRwzLFA1tIq2VfwS4p7i0dVLTjP.png)

接下来我们将尝试在 Python 2 中安装 Tcl/Tk,并重新编译 python 2,已完成 Tkinter 安装(tkinter 为 Python 的标准库,标准库的安装需要重新编译 Python ?)。
接下来我们将尝试在 Python 2/3 中安装 Tcl/Tk,并重新编译 Python 2/3,已完成 Tkinter 安装(tkinter 为 Python 的标准库,标准库的安装需要重新编译 Python )。

# ActiveTcl 安装
## ActiveTcl 安装

ActiveTcl 是 ActiveState 发布的关于 Tcl/Tk 的发行版本,该发行版本包含了最新版本的 Tk 和 Tcl 程序,我们下载其免费的社区版本进行安装即可。

参考下载链接:<https://www.activestate.com/products/activetcl/downloads/>
参考安装教程:<https://tkdocs.com/tutorial/install.html>

以下为 CentOS 7 下 \*\*ActiveTcl-8.6.8.0 \*\*的一些安装记录,仅作参考。
以下为 CentOS 7 下 **ActiveTcl-8.6.8.0** 的一些安装记录,仅作参考。

```bash
$ wget https://downloads.activestate.com/ActiveTcl/releases/8.6.8.0/ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5.tar.gz
Expand Down Expand Up @@ -153,17 +164,36 @@ Do you want to download a free trial of Komodo IDE? [Y/n]
```

ActiveTcl 安装完成后,需要把 path 添加至环境变量(\~/.bashrc):
```
export PATH="/usr/local/software/ActiveTcl-8.6/bin:$PATH"
```

export PATH="/usr/local/software/ActiveTcl-8.6/bin:$PATH"

# Python 重新编译安装
## Python 重新编译安装

想要在 Python 2.7 安装 Tkinter,需要在编译过程中通过 `--with-tcltk-includes``--with-tcltk-libs` 中指定 ActiveTcl 的头文件以及库所在路径。
参考:[What’s New In Python 3.11](https://docs.python.org/3/whatsnew/3.11.html) - doc.python.org

> 📢 **值得注意的是**
> 📢 **注意**
>
> 1. Python 3.11.x(如 Python-3.11.3)中的 configure 是没有 `--with-tcltk-includes``--with-tcltk-libs`这两个参数的!—— 目前尚没搞明白在 Python-3.11.3 应该要怎么弄!!!
> 2. Python 3.9.x(如 Python-3.9.16)在 configure 中`--with-tcltk-includes``--with-tcltk-libs`都是有的!而且通过这两个参数的确可以解决 Tkinter 的问题!!
> 1. Python 3.11.x 起(如 Python-3.11.3)中的 `configure` 已经把 `--with-tcltk-includes``--with-tcltk-libs`这两个参数移除!并使用 `TCLTK_CFLAGS``TCLTK_LIBS` !!!
> 2. Python 3.10.x (及以下版本,如 Python-3.9.16) 以及 Python 2.x.x 在 `configure``--with-tcltk-includes``--with-tcltk-libs`都是有的!而且通过这两个参数的确可以解决 Tkinter 的问题!!
### Python 3

这里以 Python-3.11.6 为例,参考 [Python 3.11.0 install doesn’t recognize homebrew Tcl/Tk due to --with-tcltk-libs, --with-tcltk-includes switches being removed from 3.11 - pyenv#2499](https://github.com/pyenv/pyenv/issues/2499),在编译安装过程中使用 `TCLTK_CFLAGS``TCLTK_LIBS` 解决 `_tkinter` 缺失的问题。
```
export TCLTK_LIBS="-L/usr/local/software/ActiveTcl-8.6/lib -ltcl8.6 -ltk8.6"
export TCLTK_CFLAGS="-I/usr/local/software/ActiveTcl-8.6/include"
cd Python-3.11.6
/configure --prefix=/usr/local/software/python-3.11.6 ......
make && make install
```

![python3-confiigure-tkinter-yes](https://slab-1251708715.cos.ap-guangzhou.myqcloud.com/KGarden/2023/python-3-tkinter.png)

### Python 2

想要在 Python 2.7 安装 Tkinter,需要在编译过程中通过 `--with-tcltk-includes``--with-tcltk-libs` 中指定 ActiveTcl 的头文件以及库所在路径。

如果在执行编译安装过程中,出现无法找到 libXss.so.1 共享动态库报错:

Expand Down Expand Up @@ -196,18 +226,19 @@ running build_scripts
```
CentOS 下请参考以下解决方法:
```
$ sudo yum install libXScrnSaver libXScrnSaver-devel
```
$ sudo yum install libXScrnSaver libXScrnSaver-devel
# 调用 Tkinter
## 调用 Tkinter
Python 2 重新编译完后,执行`python2 -m Tkinter` 显示 Tk 的 ui 界面,以及相应的 Tcl/Tk 版本。
![](https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FgBtb14ZgZFZXIRhOdt6efbYz7fd.png)
这时候,我们重新运行开头的 GUI 界面程序,可以看到中文已经正常显示:
![](https://shub-1251708715.cos.ap-guangzhou.myqcloud.com/elog-cookbook-img/FqRHUXczPdHrQjFUXNQr_Cg_j2B4.png)
# 参考资料
## 参考资料
Download And Install Tcl: ActiveTcl,<https://www.activestate.com/products/activetcl/downloads/>
Installing Tk,<https://tkdocs.com/tutorial/install.html>
Expand Down

0 comments on commit 5bc9998

Please sign in to comment.