所以,今天我正在制作输入某些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'
)确实输入了它,没有出现错误,但它仍然开始疯狂地删除内容,或添加额外的空格(包括其本身,虽然它有时会随机出现)。
答案 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"