如何在Tkinter应用程序中启用对表情符号的支持? [英] How can I enable support for emoji in Tkinter applications?

查看:26
本文介绍了如何在Tkinter应用程序中启用对表情符号的支持?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现了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上循环,您的规则是否需要考虑当前模式之外的上下文,等等都取决于您选择的规则。

无论如何,在PyPI上有许多库对此进行了各种变化,并且您已经找到了至少一个库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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆