Tkinter 和 32 位 Unicode 复制 - 任何修复?

Kon*_*hog 7 python unicode tkinter tcl emoji

我只想展示 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()
Run Code Online (Sandbox Code Playgroud)

Mac OS 上的芯片和戴尔

  • 显然这在 Windows 上运行良好 - 所以也许这是一个 MacOS 问题。
  • 我已经在两台单独的 Mac 上运行了它——它们都在最新的 OS Catalina 10.15.5 上运行——并且都显示了问题
  • 该错误与来自 python.org 的标准 Python 安装程序一起显示 - Python 3.8.3 with Tcl/Tk 8.6.8
  • 据说它可能会用 Tcl/Tk 8.6.10 修复 - 但我真的不知道如何使用普通安装程序升级 Tcl/Tk。
  • 这也被报告为错误 cf。https://bugs.python.org/issue41212

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

Don*_*ows 6

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

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