首页 > 解决方案 > Tkinter 和 32 位 Unicode 复制——有什么解决办法吗?

问题描述

我只想展示 Chip,但我得到了 ChipDale。我输入哪个 32 位字符似乎并不重要,tkinter 似乎复制了它们 -它不仅仅是花栗鼠

我在想我可能必须将它们渲染为 png,然后将它们作为图像放置,但这似乎有点......笨拙。

还有其他解决方案吗?tkinter 计划解决这个问题吗?

import tkinter as tk

# Python 3.8.3
class Application(tk.Frame):
    def __init__(self, master=None):
        self.canvas = None
        self.quit_button = None
        tk.Frame.__init__(self, master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.canvas = tk.Canvas(self, width=500, height=420, bg='yellow')
        self.canvas.create_text(250, 200, font="* 180", text='\U0001F43F')
        self.canvas.grid()

        self.quit_button = tk.Button(self, text='Quit', command=self.quit)
        self.quit_button.grid()

app = Application()
app.master.title('Emoji')
app.mainloop()

Mac OS 上的 Chip 和 Dale

其中一位 python 贡献者认为 TCL/Tk 不能/不会支持可变宽度编码(它总是在内部转换固定宽度编码),这向我表明 Tcl/Tk 不适合一般的 UTF-8 开发。

标签: pythontkinterunicodetclemoji

解决方案


根本问题是 Tcl 和 Tk 对非 BMP(Unicode 基本多语言平面)字符不太满意。在 8.6.10 之前,任何人都在猜测会发生什么;该实现只是假设这些字符不存在,并且当它们实际出现时已知是错误的(关于这方面的各个方面有几张票)。8.7 将有更强大的修复(参见TIP #389了解详细信息)——基本目标是,如果您输入非 BMP 字符,它们可以从另一侧取出,以便可以将它们写入 UTF-8 文件或在字体引擎支持的情况下由 Tk 显示它们——但某些操作仍然是错误的,因为字符串实现仍将使用代理项。9.0 将正确解决问题(通过将基本字符存储单元更改为足够大以容纳任何 Unicode 代码点)但这是一个破坏性的更改。

对于已发布的版本,如果您可以将代理从 Python 转移到 Tcl,那么它们可能最终会出现在可能做正确事情的 GUI 引擎中。在某些情况下(不包括我目前拥有的任何构建,FWIW,但我有奇怪的构建,所以不要过多阅读)。使用 8.7,通过 UTF-8 发送将能够工作;这是将得到保证的功能配置文件的一部分。(编码功能存在于旧版本中,但在 8.6 版本中,它们会对非 BMP UTF-8 执行错误的操作,并且在旧版本中会出现奇怪的中断。)


推荐阅读