如何在Tkinter中打印非BMP Unicode字符(例如𝄫) [英] How to print non-BMP Unicode characters in Tkinter (e.g. 𝄫)

查看:45
本文介绍了如何在Tkinter中打印非BMP Unicode字符(例如𝄫)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:Python 3.8开始,非BMP字符可以在空闲状态下显示(因此,Tkinter现在可能也会显示它们,因为它们都使用Tcl),它是在我发布此问题一段时间后发布的。我计划在试用Python3.9之后(在安装更新版本的xubuntu之后)对此进行编辑。我还读到在IDLE中编辑这些字符可能不像其他字符那样简单;see the last comment here


所以,今天我创建了输入某些Unicode字符的快捷方式。一切都进行得很顺利。然后,当我决定执行这些字符(在我的tkinter程序中,它们甚至不会尝试进入空闲状态)、𝄫和𝄪时,我收到了一个奇怪的意外错误,我的程序开始删除我在文本框中编写的几乎所有内容。这是不可接受的。

错误如下: _tkinter.TclError: character U+1d12b is above the range (U+0000-U+FFFF) allowed by Tcl

我意识到我使用的大多数Unicode字符在代码中只有四个字符。由于某种原因,它不喜欢五个。

那么,有没有办法在ScrolledText小部件中打印这些字符(更不用说不会搞砸其他事情了)?

UTF-8是我的编码。我使用的是Python 3.4(因此默认使用UTF-8)。

使用PRINT语句可以很好地打印这些字符。

在不使用ScrolledText.insert的情况下输入字符(例如Ctrl-shift-u,或者在代码中这样做:b'xf0x9dx84xab')确实输入了字符,没有出现该错误,但它仍然开始疯狂删除内容,或者添加额外的空格(包括自身,尽管它有时会随机重新出现)。

推荐答案

目前没有办法在Python3.4的Tkinter中显示这些字符(尽管有人提到使用代理项对可能会如何工作(在Python2.x中))。但是,您可以实现将字符转换为可显示代码并将其转换回来的方法,并在必要时调用它们。当您打印到文本小工具、复制/粘贴、文件对话框*、选项卡栏、状态栏和其他内容时,您必须调用它们。

*默认的Tkinter文件对话框不允许对对话框进行太多内部工程。我制作了自己的文件对话框,部分原因是为了帮助解决这个问题。如果你有兴趣,请告诉我。希望将来我能在这里发布它们的代码。

这些方法将超出范围的字符转换为代码,反之亦然。代码的格式为序号,如下所示:{119083ū}。方括号和ū只是为了区分这是一个代码。{119083ū}表示𝄫。正如您所看到的,我还没有费心找到一种方法来转义代码,尽管我确实故意尝试使代码不太可能发生。转换时使用的ᗍ119083ūᗍ也是如此。不管怎样,我的意思是最终要添加转义序列。这些方法取自我的类(因此self)。(是的,我知道在Python中不必使用分号。我只是喜欢它们,并认为它们在某些情况下使代码更具可读性。)

import re;

def convert65536(self, s):
    #Converts a string with out-of-range characters in it into a string with codes in it.
    l=list(s);
    i=0;
    while i<len(l):
        o=ord(l[i]);
        if o>65535:
            l[i]="{"+str(o)+"ū}";
        i+=1;
    return "".join(l);
def parse65536(self, match):
    #This is a regular expression method used for substitutions in convert65536back()
    text=int(match.group()[1:-2]);
    if text>65535:
        return chr(text);
    else:
        return "ᗍ"+str(text)+"ūᗍ";
def convert65536back(self, s):
    #Converts a string with codes in it into a string with out-of-range characters in it
    while re.search(r"{ddddd+ū}", s)!=None:
        s=re.sub(r"{ddddd+ū}", self.parse65536, s);
    s=re.sub(r"ᗍ(ddddd+)ūᗍ", r"{1ū}", s);
    return s;

这篇关于如何在Tkinter中打印非BMP Unicode字符(例如&#119083;)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆