一、背景
最近使用python tkinter编写界面应用时,发现按钮的中文名称在windows上显示正常,但是在linux上显示为中文的unicode编码;文本输入框也是,输入中文输时,text控件上也显示为unicode编码,如下图所示;但是把这些unicode编码直接打印在控制台上,中文能正常显示。
代码如下:
import tkinter as tkclass App(tk.Tk):def __init__(self):super().__init__()self.title("滚动条测试")self.geometry("450x480")self.text = tk.Text(self, width=66, wrap="none")self.text.grid(row=0, column=0, sticky="nsew")self.vscrollbar = tk.Scrollbar(self, orient="vertical", command=self.text.yview)self.vscrollbar.grid(row=0, column=1, sticky="ns")self.hscrollbar = tk.Scrollbar(self, orient="horizontal", command=self.text.xview)self.hscrollbar.grid(row=1, column=0, sticky="ew")self.text.config(yscrollcommand=self.vscrollbar.set, xscrollcommand=self.hscrollbar.set)button = tk.Button(self, text="选择源文件夹", font=('宋体', 10), width=36)button.grid(row=2, column=0)button1 = tk.Button(self, text="\u0061\u4e2d\u6587", font=('宋体', 14), width=32, command=self.print_select)button1.grid(row=3, column=0)if __name__ == "__main__":app = App()app.mainloop()
二、解决过程
首先,怀疑解码的问题,在网上把编码相关的知识以及因为编解码导致的乱码问题的解决办法研究了一遍,得出结论,编解码没有问题,有编解码问题的同学可以参考:https://blog.csdn.net/qq_37453155/article/details/130372407
其次,怀疑字体不支持,但字体不支持应该是文字显示不全或者偏旁部首缺失,跟我的现象也不一直;字体的问题请参考:https://blog.csdn.net/m0_51004308/article/details/125523361
三、问题解决
由于上述都解决不了问题,转而怀疑是tk库本身不支持中文。
查看本系统python有3个版本(linux系统下有2.7和3.8,还有一个是安装anaconda时带的3.7),当前默认使用的是anaconda带的python;如是改为用3.8的python来跑这个脚本,结果提示tkinter不存在;
接下来就是解决tkinter不存在的问题了,显然,首先想到的时用pip
xxx]$ python3.8 -m pip install tkinter
ERROR: Could not find a version that satisfies the requirement tkinter (from versions: none)
ERROR: No matching distribution found for tkinter
不起作用!
网上查了下,tkinter不能这样安装,需要安装python的tk包,最后受到https://www.cnblogs.com/lccpythonjilu/p/15361392.html的启发,安装了tkinter:
sudo yum install python38-tk*
注意,上面命令中python后面的版本号需要跟系统一致,例如我的是3.8,所以命令中是38;安装后测试tkinter库导入正常。最好再执行命令python3.8 tklearn.py
,中文显示正常!
附:
解决问题过程中还对比了anaconda的python和系统的python3.8安装包的差异,发现anaconda中多个叫nltk的包,我担心它跟tk库相关,所以也安装了,命令为:python3.8 -m pip install nltk --user
另外还安装了tk相关的所有包,命令为sudo yum -y install tk*
这两个操作也不知道对上面的问题解决是不是有帮助,先列出来。如果前面解决不了问题,再把这两个命令也执行下。
疑问:
上述的界面截图中,主窗体的标题中文显示一直是正常的,这个怎么解释?有知道原因的网元请评论告知,多谢!