【发布时间】:2020-04-18 02:29:55
【问题描述】:
我正在尝试在 tkinter GUI 中显示印度语言。我使用的是 Python 3,而 tkinter 的版本是 8.6。
在我的代码中,python 似乎可以正确处理语言,因为当我打印它们时,字体和字符序列是正确的。但是当我在 tkinter GUI(标签、文本或画布)上显示文本时,它们会变得混乱或处理不正确。
字体似乎不是问题,因为正确选择了语言本身并且许多字母都是正确的。
我在 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 不能正确处理所有 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)
【问题讨论】:
-
我认为我无能为力,而且我的眼睛不够 unicode,无法读取您的字符串,但在阅读您提到的线程后,尝试 new_string =
unicodedata.normalize('x', your_string),其中 x 是“NFD”或“NFC”以查看其中一个是否正确显示。对于某些字符,这使用几个 unicode 点或仅一个点进行编码。看看它是否改变了什么。 -
@snakecharmerb ,是的,字体在其他应用程序中正确呈现。我试过多种字体。
-
@progmatico 虽然我会尝试您的解决方案并报告一段时间内发生的情况,但问题似乎在于印度语言中常见的“半”字母被渲染器转换为完整字母,并且序列互换为某些字符组合。
-
在最新的 Python 版本(3.7.6 和 3.8.1)中,Tkinter 中有一些与 Unicode 相关的增强。确保您首先在这些版本中尝试您的代码。
标签: python python-3.x tkinter unicode