python - Unicode 在 tkinter 中显示不正确

标签 python python-3.x tkinter unicode

我正在尝试在 tkinter GUI 中显示印度语言。我使用的是 Python 3,tkinter 的版本是 8.6。
在我的代码中,python 似乎可以正确处理语言,因为当我打印它们时,字体和字符序列是正确的。但是,当我在 tkinter GUI 上显示文本(标签、文本或 Canvas )时,它们会变得困惑或无法正确处理。
字体似乎不是问题,因为语言本身选择正确并且许多字母都是正确的。 我8年前看过这个帖子tkinter cannot display unicode characters correctly ,我的问题似乎很相似,但也没有给出解决方案。 我粘贴下面代码的简化版本。请注意 - 所有使用的字体都安装在我的系统中。

root = tk.Tk()
text = 'श्वसन प्रणाली में नाक गुहा, ट्रेकिआ और फेफड़े होते हैं'
labelcheck = ttk.Label(text=text, font = "Lohit\ Devnagri")
textcheck = tk.Text()
textcheck.insert(tk.END, text)
canvascheck = tk.Canvas(root,width=800, height=200)
canvascheck.create_text(200, 20, font="Lohit\ Devnagri", text=text)
labelcheck.grid(row = 0, column = 0)
textcheck.grid(row =0, column = 1)
canvascheck.grid(row = 1, column =0)
print(text)
root.mainloop()

控制台中打印的文本与代码中的文本完全匹配。 tkinter UI 中的文本位于下面的图像链接中。

Tkinter Screen

请注意,对于不懂该语言的人来说,存在细微的差异,但对于母语人士/读者来说,这些变化并非微不足道。

那么,问题是 tkinter 是否无法正确处理所有 unicode 字符?我应该停止朝这个方向挖掘以使其发挥作用吗?我正在 Raspberrypi 上开发一个应用程序,因此我不想放弃 tkinter,因为它显然响应非常灵敏且重量轻。

这里的任何帮助对我来说都是无价的。

编辑1: 根据 progmaticos 的建议,我采用了前几个单词的 unicode 序列并对它们应用了规范化 API。我仍然看到同样的问题 - python 打印出的内容是正确的,而 tkinter 的 GUI 中显示的内容是不正确的。

unicodetext = '\u0936\u094D\u0935\u0938\u0928\20\u092A\u094D\u0930\u0923\u093E\u0932\u0940'

text1 = unicodedata.normalize('NFC', unicodetext)
text2 = unicodedata.normalize('NFD', unicodetext)
text3 = unicodedata.normalize('NFKD', unicodetext)

最佳答案

问题不在于 tkinter。看起来这是一个操作系统问题。 Windows 上具有相同 Python 版本(3.8)的相同应用程序可以正确显示 unicode 字符。在 ubuntu 和 rasbian 中问题仍然存在。将在未来几天检查该问题。但问题既不是 tkinter 的,也不是 python 的。感谢大家的帮助。

关于python - Unicode 在 tkinter 中显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59512272/

相关文章:

python 2.7 : delete item from list by value

将字节转换为整数的 Python 2 和 3 兼容方法

python - 按下 Tkinter 时清除输入框文本

python - 只从 mysql 获取最后一个值

python - 按钮释放 Tkinter

python - 如何消除 sklearn 上决策树的随机性?

python - 如何在 TensorFlow 上进行 Xavier 初始化

python - 在python中计算对数

arrays - 快速组合多幅图像的(x,y)像素值的方法?

python - : <function WeakValueDictionary 中的异常被忽略