如何在Tkinter中打印非BMP Unicode字符(例如𝄫;) [英] How to print non-BMP Unicode characters in Tkinter (e.g. 𝄫)
问题描述
注意:从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字符(例如𝄫;)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!