由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接。

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

#-*- coding: utf-8 -*-

import sys

from tkinter import *
top=Tk()
top.wm_title("菜单")
top.geometry("800x600+300+100") # 创建一个菜单项,类似于导航栏
menubar=Menu(top) # 创建菜单项
fmenu1=Menu(top)
# 如果该菜单时顶层菜单的一个菜单项,则它添加的是下拉菜单的菜单
for item in ['新建文件', '打开文件','结果保存']:
   fmenu1.add_command(label=item)

fmenu2=Menu(top)
for item in ['程序设置','程序运行']:
   fmenu2.add_command(label=item)

fmenu3=Menu(top)
for item in ['使用教程', '版权信息', '检查更新']:
   fmenu3.add_command(label=item)

# add_cascade 的一个很重要的属性就是 menu 属性,它指明了要把那个菜单级联到该菜单项上
# 当然,还必不可少的就是 label 属性,用于指定该菜单项的名称
menubar.add_cascade(label='文件', menu=fmenu1)
menubar.add_cascade(label="程序", menu=fmenu2)
menubar.add_cascade(label="帮助", menu=fmenu3)

# 最后可以用窗口的 menu 属性指定我们使用哪一个作为它的顶层菜单
top['menu']=menubar
top.mainloop()

  • 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

  • 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 是否完整安装。

  • python 的 PyPI 仓库中是没有 tkinter 包的,想要使用 pip install tkinter 卸载或者重装都行不通。

  • 网上也有人说可以使用 yum install python3-tk/python-tk 解决,但对于本人来说,没用。

什么是 tcl, tk, tkinter

The 
tkinter
 package (“Tk interface”) is the standard Python interface to the Tk GUI toolkit. Both Tk and 
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.)

Running 
python -
m tkinter
 from the command line should open a window demonstrating a simple Tk interface, letting you know that 
tkinter
 is properly installed on your system, and also showing what version of Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific to that version.

From https://docs.python.org/3/library/tkinter.html

Tcl 是”工具控制语言(Tool Control Language)”的缩写。Tk 是 Tcl “图形工具箱” 的扩展,它提供各种标准的 GUI 接口项,以利于迅速进行高级应用程序开发。

tkinter 包(”Tk 接口”)是 Tk GUI 工具包的标准 Python 接口。 Tk 和 tkinter 在大多数 Unix 平台以及 Windows 系统上都可用(Tk 本身不是 Python 的一部分,它在 ActiveState 中维护)。您可以通过从命令行运行 python -m tkinter 来检查 tkinter 是否已正确安装在系统上。如果已经安装该命令会打开一个简单的 Tk 界面,该界面除了让我们知道 tkinter 已正确安装,并且还显示安装了哪个版本的 Tcl/Tk,因此我们可以阅读特定于该版本的 Tcl/Tk 文档。

如果 tkinter 没有安装,则会提示找不到该包(注意在 Python 2 中该包包名为 Tkinter,Python 3 中为 tkinter):

接下来我们将尝试在 Python 2 中安装 Tcl/Tk,并重新编译 python 2,以完成 Tkinter 安装并测试相关 UI 界面的 Unicode 乱码是否正常 (tkinter 为 Python 的标准库,标准库的安装需要重新编译 Python ?)。

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 的一些安装记录,仅作参考。

$ wget https://downloads.activestate.com/ActiveTcl/releases/8.6.8.0/ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5.tar.gz
$ tar zvxf ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5.tar.gz
$ cd ActiveTcl-8.6.8.0-x86_64-linux-glibc-2.5-28eabcbe7
$ ./install.sh
Welcome to

 ActiveTcl Community Edition for Linux/x86_64

Supported Packages:

       Tcl     8.6     Thread  2.7.3
       Tk      8.6     trofs   0.4.9

Extra Packages:

zlib 1.2.11
libiconv 1.15

...

Cancel => C
Next   => [RET] >> 【Enter 回车】

...

Cancel         [no]  => [RET]
Accept License [yes] => 'A' >> yes

Please specify the installation directory.
Path [/opt/ActiveTcl-8.6]: /usr/local/software/ActiveTcl-8.6

Please specify the directory for the demos.
Path [/usr/local/software/ActiveTcl-8.6/demos]: 【Enter 回车】

...

Installing ActiveTcl ...
Installing demos ...
Done ...
Finishing the installation
Patching the shells and libraries for the new location ...
* /usr/local/software/ActiveTcl-8.6/bin/tclsh8.6 ...
* /usr/local/software/ActiveTcl-8.6/bin/wish8.6 ...

...

For a csh or compatible perform
   setenv PATH "/usr/local/software/ActiveTcl-8.6/bin:$PATH"

For a sh or similar perform
   PATH="/usr/local/software/ActiveTcl-8.6/bin:$PATH"
   export PATH

Some shells (bash for example) allow
   export PATH="/usr/local/software/ActiveTcl-8.6/bin:$PATH"

Similar changes are required for MANPATH
Finish >>

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"

Python 重新编译安装

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

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

$ tar zvxf Python-2.7.15.tgz
$ cd Python-2.7.15
$ ./configure --prefix=/usr/local/software/python-2.7 --with-tcltk-includes='-I/usr/local/software/ActiveTcl-8.6/include' --with-tcltk-libs='/usr/local/software/ActiveTcl-8.6/lib/libtcl8.6.so /usr/local/software/ActiveTcl-8.6/lib/libtk8.6.so' --enable-optimizations
$ make

......

warning: building with the bundled copy of libffi is deprecated on this platform.  It will not be distributed with Python 3.7
*** WARNING: renaming "_tkinter" since importing it failed: libXss.so.1: cannot open shared object file: No such file or directory

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_dbm                  _gdbm
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
atexit                pwd                   time

Following modules built successfully but were removed because they could not be imported:
_tkinter

running build_scripts

......

CentOS 下请参考以下解决方法:

$ sudo yum install libXScrnSaver libXScrnSaver-devel

Tkinter 安装成功

Python 2 重新编译完后,执行 python2 -m Tkinter 显示 Tk 的 ui 界面,以及相应的 Tcl/Tk 版本。

这时候,我们重新运行开头的 GUI 界面程序,可以看到中文已经正常显示:

参考资料:


  • Download And Install Tcl: ActiveTcl,activestate.com

  • Installing Tk,TkDocs - Tk Tutorial - Installing Tk

  • bladestone,Python下 "No module named _tkinter" 问题解决过程分析,简书

  • wangxuwei,Python GUI编程(Tkinter)文件对话框,开源中国

·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

入门 Python GUI 开发的第一个坑的更多相关文章

  1. Python GUI开发环境的搭建

    原文:Python GUI开发环境的搭建 最近对Python的开发又来了兴趣,对于Python的开发一直停留在一个表面层的认识,玩的部分比较大. Python的入手简单,语法让人爱不释手,在网络通信方 ...

  2. Python GUI开发,效率提升10倍的方法!

    1 框架简介 这个框架的名字叫 PySimpleGUI,它完全基于Python语言,能非常方便地开发GUI界面,代码量相比现有框架减少50%到90%.并且,它提供了极为友好的Python风格的接口,大 ...

  3. 踩的python列表及for循环一个坑儿

    一个列表循环的问题,困扰了半个小时,我也是醉了,值得深思 下面开始提需求: 一个列表mylist = [{'tag':1,'num' :5000},{'tag':2,num: 6000},{'tag' ...

  4. python的默认参数的一个坑

    前言 pass 正文 在 https://docs.python.org/3/tutorial/controlflow.html#default-argument-values 中,有这样一段话 Im ...

  5. 【python】python GUI开发框架介绍

    Python GUI开发的库不少.最常用的的也就几个. Tkinter -Tk是Python自带的GUI库, 上手简单, 做个简单界面基本够用了,但是不够美观,功能不全面. wxPython -开源免 ...

  6. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...

  7. squareline搭档OneOS图形组件之可视化GUI开发

    LVGL+OneOS! LVGL,一款很火的GUI开发库,一个高度可裁剪.低资源占用.界面美观且易用的嵌入式系统图形库.本身并不依赖特定的硬件平台,任何满足LVGL硬件配置要求的微控制器均可运行LVG ...

  8. 程序员带你十天快速入门Python,玩转电脑软件开发(四)

    本系列文章立志于从一个已经习得一门编程语言的基础之上,全面介绍Python的相关开发过程和相关经验总结.本篇文章主要是基于上一篇的程序员带你十天快速入门Python,玩转电脑软件开发(三)的基础之上, ...

  9. 程序员带你十天快速入门Python,玩转电脑软件开发(二)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

  10. 程序员带你十天快速入门Python,玩转电脑软件开发(一)

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...

随机推荐

  1. SpringBoot——定制错误页面及原理

    更多内容,前往 IT-BLOG 一.SpringBoot 默认的错误处理机制 [1]浏览器返回的默认错误页面如下:  ​☞ 浏览器发送请求的请求头信息如下:text/html 会在后面的源码分析中说到 ...

  2. Redis Cluster集群搭建及节点的添加、删除

    系统性学习,移步IT-BLOG 一.什么是 Redis Cluster Redis 是在内存中保存数据的,而我们的电脑一般内存都不大,这也意味着 Redis 不适合存储大数据,适合存储大数据的是 Ha ...

  3. Comic Life - 超棒的漫画制作工具,拥有多种动画模版,创作属于自己的漫画

    Comic Life是一个照片编辑器,能够添加各种效果,并基于它们创建漫画.该工具包包括各种各样的模板,可以很容易地将照片放置在工作表上,还有大量各种形状的标注.除了拼贴画上的标注之外,您还可以添加带 ...

  4. 设计模式(三十)----综合应用-自定义Spring框架-自定义Spring IOC-定义bean、注册表相关类

    现要对下面的配置文件进行解析,并自定义Spring框架的IOC对涉及到的对象进行管理. <?xml version="1.0" encoding="UTF-8&qu ...

  5. 股票K线图概要——R语言

    K线图是200多年前日本人发明的,后来传入了美国.K线图本来就是对当前数据的可视化显示而已,但是越来越多的人对K线图做出了痴迷的分析和解读,有众多追随者也根据K线图指导自己的具体行动,因此,K线图在实 ...

  6. 标准正态分布表—R语言

    正态分布是最重要的一种概率分布.正态分布概念是由德国的数学家和天文学家Moivre于1733年首次提出的,但由于德国数学家Gauss率先将其应用于天文学家研究,故正态分布又叫高斯分布.高斯这项工作对后 ...

  7. 图与网络分析—R实现(三)

    最小生成树 (Minimum Spanning Tree) 应该大家都不陌生,Spanning 有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树.所以,一般考虑无向图里去造生成树. ...

  8. 四月十二号java基础知识

    1.面向对象的编程思想是力图使在计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能地一致.2.类(class)和对象(object)是面向对象程序设计方法中最核心的概念3.类是对某一事物的描述 ...

  9. LeeCode 二叉树问题(四)

    二叉搜索树的应用问题 二叉搜索树的定义 若左子树不空,则左子树上所有节点的值均小于根节点的值 若右子树不空,则右子树上所有节点的值均大于根节点的值 它的左右子树也均为二叉搜索树 中序遍历结果为一个升序 ...

  10. PHP大文件分割上传 PHP分片上传

    这篇文章主要为大家详细介绍了PHP大文件分割上传,PHP分片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关 upload_ma ...