Tkinter 无法从条目中解码表情符号
Posted
技术标签:
【中文标题】Tkinter 无法从条目中解码表情符号【英文标题】:Tkinter cant decode emojis from entryy 【发布时间】:2020-05-11 03:49:18 【问题描述】:我有一个我的程序示例:
import re
import tkinter as T
_nonbmp = re.compile(r'[\U00010000-\U0010FFFF]')
def _surrogatepair(match):
char = match.group()
assert ord(char) > 0xffff
encoded = char.encode('utf-16-le')
return (
chr(int.from_bytes(encoded[:2], 'little')) +
chr(int.from_bytes(encoded[2:], 'little')))
def createSurrogate(data):
return _nonbmp.sub(_surrogatepair, data)
def server_send(event=None):
data = entry_field.get()
server.send(data, False)
entry_text.set("")
def insertEmoji(code):
entry_field.insert("insert", code)
def emoji():
win = T.Tk()
win.title("Emojis")
emoji1 = T.Button(win, text=createSurrogate("\U0001F602"), command=lambda: insertEmoji("\U0001F602"))
emoji1.pack()
win.mainloop()
main = T.Tk()
main.title("SDT_Client")
entry_text = T.StringVar()
entry_text.set("")
messages_frame = T.Frame(main)
scrollbar = T.Scrollbar(messages_frame)
msg_list = T.Listbox(messages_frame, height=15, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=T.RIGHT, fill=T.Y)
msg_list.pack(side=T.LEFT, fill=T.BOTH)
msg_list.pack()
messages_frame.pack()
entry_field = T.Entry(main, textvariable=entry_text)
entry_field.bind("<Return>", server_send)
entry_field.pack()
send_button = T.Button(main, text="Send", command=server_send)
send_button.pack()
emojiButton = T.Button(main, text="Emojis", command=emoji)
emojiButton.pack()
总而言之,我有一个条目,下方有一个发送按钮,下方有一个表情符号按钮。单击发送按钮时,条目的内容将发送到服务器。单击表情符号按钮时,将打开一个新窗口,其中显示更多带有表情符号的按钮。单击其中一个按钮时,表情符号将插入到输入字段中。但是当我尝试发送包含表情符号的消息时,我收到以下错误:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:\Users\....\nClient.py", line 36, in server_send
data = entry_field.get()
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 2682, in get
return self.tk.call(self._w, 'get')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte
我知道问题出在以下行:
data = entry_field.get()
但我想不出解决办法。
【问题讨论】:
【参考方案1】:错误是因为 python 使用 utf-8
而 emojis 使用不同的编解码器,这是我为你找到的:https://pypi.org/project/emoji-encoding/。如果您想自己更改编码,这是我找到的一个 SO question Changing default encoding of Python?。
编辑 1:
在记事本中打开代码,然后单击“文件”,然后单击“另存为”,然后单击“编码:ANSI”,然后单击 UTF-8,然后单击“是”确认。
您可以删除部分代码来解码表情符号,因为 python 已经为您做到了:)
(抱歉,第一个答案很愚蠢)
【讨论】:
以上是关于Tkinter 无法从条目中解码表情符号的主要内容,如果未能解决你的问题,请参考以下文章