gpt4 book ai didi

python - 如何在 Tkinter 应用程序中启用对表情符号的支持?

转载 作者:行者123 更新时间:2023-12-03 22:43:11 25 4
gpt4 key购买 nike

我已经实现了这个 Python chat application由 Saurabh Chaturvedi 撰写,开始了解网络的工作原理。该应用程序很简单,并且使用了 Tkinter 模块。

我想扩展应用程序的功能,使用户能够在消息框中键入表情符号,并在他们发送消息时将它们呈现为消息列表中的表情符号。例如,如果用户在消息框中键入“:)”,它应该呈现为😊。

到目前为止,我已经研究了如何在 Tkinter 应用程序中启用对表情符号的支持。我遇到了Displaying emojis/symbols in Python using tkinter lib ,但我不认为它直接解决了我的问题。我不确定我目前是否正在以正确的方式解决这个问题。

如果有任何帮助,我正在运行 Windows 10 并使用 Python 3。您应该能够通过运行 Saurabh’s article 中描述的两个脚本(服务器和客户端)来实现聊天应用程序。 . (另外,一个潜在的相关问题是表情符号在我的 Python 3 解释器中没有正确显示。例如,

>>> import emoji
>>> print(emoji.emojize(":thumbs_up:"))

在方框中产生两个问号,而不是 👍。)

关于如何在消息列表中呈现表情符号的任何建议?

编辑:

根据@abarnert 下面的评论,值得一提的是这个问题确实 不是 源于我尝试使用表情符号库将用户的“:)”翻译成表情符号。相反,最初的问题出现是因为我不确定如何在基于 Tkinter 的应用程序中将“:)”渲染为😊。

最佳答案

您在这里有多个问题,我不确定您会遇到哪一个问题,因此我将尝试涵盖所有问题。

首先,你如何“emojify”一个字符串?

您需要准确定义这意味着什么——您将哪些输入集映射到哪些输出,如果 :8是输入是否意味着80:80应该转: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 无法正确处理表情符号(和其他非 BMP 字符)的事实?

这部分是 the question you linked 的副本. Tkinter 有一个已知的错误,该错误在 3.7 中仍然存在,并且最知名的解决方法有点丑陋。

但是,虽然它可能很丑陋,但这并不难。该问题的答案链接到 another question , Martijn 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)

关于python - 如何在 Tkinter 应用程序中启用对表情符号的支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52228940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com