如何在Tkinter中打印非BMP Unicode字符(例如)

时间:2014-05-07 23:18:22

标签: unicode utf-8 tkinter tcl python-3.4

所以,今天我正在制作输入某些Unicode字符的快捷方式。一切进展顺利。然后,当我决定做这些字符时(在我的Tkinter程序中;他们甚至不会尝试进入IDLE),并且,我得到一个奇怪的意外错误,我的程序开始删除我在文本框中写的所有内容。这是不可接受的。

这是错误: _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'\xf0\x9d\x84\xab')确实输入了它,没有出现错误,但它仍然开始疯狂地删除内容,或添加额外的空格(包括其本身,虽然它有时会随机出现)。

2 个答案:

答案 0 :(得分:1)

目前无法显示这些字符,因为它们应该在Python 3.4中查看Tkinter(虽然有人提到如何使用代理对可以在[Python 2.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"{\d\d\d\d\d+ū}", s)!=None:
        s=re.sub(r"{\d\d\d\d\d+ū}", self.parse65536, s);
    s=re.sub(r"ᗍ(\d\d\d\d\d+)ūᗍ", r"{\1ū}", s);
    return s;

答案 1 :(得分:0)

我的回答是基于@Shule的答案,但提供了更多的pythnoic和易于阅读的代码。它也提供了一个真实的案例。

这是填充.csv的项目的方法。没有回转。此解决方案仅负责显示包含Tcl不允许字符的字符串。

> coilid$StartTime[1:5]
[1] "06/01/2017 00:29:10" "06/01/2017 01:19:19" "06/01/2017 02:09:31" "06/01/2017 03:05:08"
[5] "06/01/2017 03:48:51"