如何在Tkinter应用程序中支持表情符号?

2024-05-29 03:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经实现了Saurabh Chaturvedi的这个Python chat application,开始学习网络是如何工作的。该应用程序很简单,并利用了Tkinter模块

我想通过允许用户在消息框中键入表情符号,并在发送消息时将其呈现为消息列表中的表情符号来扩展应用程序的功能。例如,如果用户在消息框中键入“:)”,则它应呈现为😊.

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

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

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

结果在框中显示两个问号,而不是👍.)

关于如何在消息列表中呈现表情符号,有什么建议吗


编辑:

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


Tags: 模块用户网络应用程序消息利用列表键入
1条回答
网友
1楼 · 发布于 2024-05-29 03:19:07

你这里有很多问题,我不确定你会遇到哪一个问题,所以我会尽力解决所有问题


首先,如何“表情化”字符串

您需要确切地定义什么是什么映射输入到什么输出,如果^ {CD1>}是一个输入,这意味着{{CD2}}应该将中间的^ {< CD1}}转换成表情符号(如果不是,确切地说是什么规则,为什么不),等等。

那么,无论您是在s.split()上循环还是在更复杂的re.finditer上循环,您的规则是否需要考虑当前模式之外的上下文,等等,都不难实现,这取决于您选择的规则

无论如何,PyPI上有许多库在这方面做了各种各样的变化,您已经找到了至少一个^{}。所以我假设这个问题已经解决了


接下来,在哪里将其挂接到代码中

假设您有一个回调,每当用户提交聊天信息时就会触发该回调。我不知道你是如何设置的,但这并不重要,所以让我们来做一个简单的例子:

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有一个已知的bug,它在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)

相关问题 更多 >

    热门问题