python - Tkinter 和 32 位 Unicode 复制——有什么解决办法吗?
问题描述
我只想展示 Chip,但我得到了 Chip和Dale。我输入哪个 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()
- 显然这在 Windows 上运行良好 - 所以可能是 MacOS 的问题。
- 我已经在两台单独的 Mac 上运行它——它们都在最新的 OS Catalina 10.15.5上——并且都显示了问题
- 来自 python.org 的标准 Python 安装程序显示该错误 - 带有 Tcl/Tk 8.6.8 的 Python 3.8.3
- 据说它可能会用 Tcl/Tk 8.6.10 修复 - 但我真的不知道如何使用普通安装程序升级 Tcl/Tk。
- 这也被报告为错误 cf。https://bugs.python.org/issue41212
其中一位 python 贡献者认为 TCL/Tk 不能/不会支持可变宽度编码(它总是在内部转换固定宽度编码),这向我表明 Tcl/Tk 不适合一般的 UTF-8 开发。
解决方案
根本问题是 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 执行错误的操作,并且在旧版本中会出现奇怪的中断。)
推荐阅读
- java - Java Regex - 在字符串中查找数值
- java - 如何在字符串java中查找和索引ASCII字符值29
- c# - 获取要被 UWP POS 打印机驱动程序/API 识别的 ESC/POS 模式打印机
- python - TCP 发送和接收数据包
- angular - 角度操作集合
- java - 如何指定要测试的不同类名模式?
- python - 将数据从 Google 存储桶读取到阵列
- javascript - 如何根据数组更新复选框状态?
- javascript - 具有单独搜索字段的 PrimeNG Angular 6 turbotable 引发错误
- spring - STS 3.9.5 自动完成功能不适用于 roo