如何在Tkinter应用程序中启用对表情符号的支持? [英] How can I enable support for emoji in Tkinter applications?
问题描述
我实现了Saurabh Chaturvedi的Python chat application,以开始学习网络是如何工作的。该应用程序很简单,并且使用了Tkinter模块。
我想扩展应用程序的功能,允许用户在消息框中输入表情符号,并在发送消息时将其呈现为消息列表中的表情符号。例如,如果用户在消息框中键入‘:)’,它应该呈现为😊。
到目前为止,我已经研究了如何在Tkinter应用程序中启用对emoji的支持。我遇到了Displaying emojis/symbols in Python using tkinter lib,但我不认为它直接解决了我的问题。我不确定我目前是否在以正确的方式解决这个问题。
如果有任何帮助的话,我正在运行Windows 10并使用Python3。您应该能够通过运行Saurabh’s article中描述的两个脚本(服务器和客户端)来实现聊天应用程序。(此外,一个潜在的相关问题是,表情符号在我的Python3解释器中无法正确显示。例如,>>> import emoji
>>> print(emoji.emojize(":thumbs_up:"))
在框中显示两个问号,而不是👍。)
关于如何在消息列表中呈现emoji表情有什么建议吗?
编辑:
根据@abarnert下面的评论,值得一提的是,这个问题不是源于我试图使用emoji库将用户的‘:)’翻译成emoji。相反,最初的问题出现是因为我不确定如何在基于Tkinter的应用程序中以😊的身份呈现‘:)’。
推荐答案
您这里有多个问题,我不确定您使用的是哪一个,所以我将尝试覆盖所有问题。
首先,如何对字符串进行"Emojify"?
您需要定义这到底是什么意思--什么输入集映射到什么输出,如果:8
是输入,这是否意味着:8
应该将中间的:8
转换为表情符号(如果不是,那么说明为什么不是的规则到底是什么)等等。
那么它就不那么难实现了--无论您是在s.split()
上循环还是在更复杂的re.finditer
上循环,您的规则是否需要考虑当前模式之外的上下文,等等都取决于您选择的规则。
emoji
。所以我假设这个问题已经解决了。
接下来,您在哪里将其挂钩到您的代码中?
假设,每当用户提交聊天消息时,都会触发一个回调。我不知道您具体是如何设置的,但这并不重要,所以让我们来举一个简单的例子:
def callback(widget):
msg = widget.get()
conn.sendall(msg)
msglog.append(f'>>> {msg}')
此函数从消息输入小部件获取字符串内容,然后两者都将该字符串发送到服务器,并在消息日志小部件中显示它。因此,您需要做的就是:
def callback(widget):
msg = widget.get()
msg = emojify(msg)
conn.sendall(msg)
msglog.append(f'>>> {msg}')
第三,你如何处理tkinter无法正确处理emoji(和其他非BMP字符)的问题?
此部分是the question you linked的DUP。Tkinter有一个已知的错误,在3.7版本中仍然存在,而最著名的解决方法有点难看。但是,尽管它可能难看,但它并不是那么难。这个问题的答案链接到another question,在another question中,Martjn Pieters提供了一个很好的with_surrogates
函数,您只需在表情符串上调用该函数。
如果您想要简单但麻烦的东西-这将使服务器对但有错误的tkinter客户端几乎毫无用处-您可以在通过网络发送消息之前这样做:
def callback(widget):
msg = widget.get()
msg = emojify(msg)
tkmsg = with_surrogates(msg)
conn.sendall(tkmsg)
msglog.append(f'>>> {tkmsg}')
但一个更干净的解决方案是将它们作为适当的UTF-8通过网络发送,并仅将其替代以供显示,两者都在这里:
def callback(widget):
msg = widget.get()
msg = emojify(msg)
conn.sendall(msg)
tkmsg = with_surrogates(msg)
msglog.append(f'>>> {tkmsg}')
…在从其他用户接收消息的代码中:
def on_msg(msg):
tkmsg = with_surrogates(msg)
msglog.append(tkmsg)
这篇关于如何在Tkinter应用程序中启用对表情符号的支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!