У вас здесь несколько проблем, и я не уверен, на какой вы застряли, поэтому я постараюсь охватить все.
Во-первых, как вы "смоделируете" строку?
Вам необходимо точно определить, что это означает - какой набор входов вы сопоставляете с какими выходами, если :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)?
Эта часть является дубликатом вопроса, который вы связали . В Tkinter есть известная ошибка, которая по-прежнему существует на 3.7, и самый известный обходной путь - это некрасиво.
Но, хотя это может быть безобразно , это не так трудно . Ответ на этот вопрос связан с другим вопросом , где 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)