Tkinter не может расшифровать эмодзи от энтузиастов - PullRequest
1 голос
/ 24 января 2020

У меня есть образец моей программы:

import re
import tkinter as T
_nonbmp = re.compile(r'[\U00010000-\U0010FFFF]')

def _surrogatepair(match):
    char = match.group()
    assert ord(char) > 0xffff
    encoded = char.encode('utf-16-le')
    return (
        chr(int.from_bytes(encoded[:2], 'little')) + 
        chr(int.from_bytes(encoded[2:], 'little')))

def createSurrogate(data):
    return _nonbmp.sub(_surrogatepair, data)

def server_send(event=None):
    data = entry_field.get()
    server.send(data, False)
    entry_text.set("")

def insertEmoji(code):
    entry_field.insert("insert", code)

def emoji():
    win = T.Tk()
    win.title("Emojis")
    emoji1 = T.Button(win, text=createSurrogate("\U0001F602"), command=lambda: insertEmoji("\U0001F602"))
    emoji1.pack()
    win.mainloop()

main = T.Tk()
main.title("SDT_Client")
entry_text = T.StringVar()
entry_text.set("")
messages_frame = T.Frame(main)
scrollbar = T.Scrollbar(messages_frame)  
msg_list = T.Listbox(messages_frame, height=15, width=100, yscrollcommand=scrollbar.set)
scrollbar.pack(side=T.RIGHT, fill=T.Y)
msg_list.pack(side=T.LEFT, fill=T.BOTH)
msg_list.pack()
messages_frame.pack()

entry_field = T.Entry(main, textvariable=entry_text)
entry_field.bind("<Return>", server_send)
entry_field.pack()
send_button = T.Button(main, text="Send", command=server_send)
send_button.pack()
emojiButton = T.Button(main, text="Emojis", command=emoji)
emojiButton.pack()

Подводя итог, у меня есть запись с кнопкой отправки внизу и кнопкой эмодзи внизу. При нажатии кнопки отправки содержимое записи отправляется на сервер. При нажатии кнопки смайликов открывается новое окно с большим количеством кнопок с изображением смайликов. При нажатии на одну из этих кнопок эмодзи вставляется в поле ввода. Но когда я пытаюсь отправить сообщение, содержащее смайлики, я получаю следующую ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\....\nClient.py", line 36, in server_send
    data = entry_field.get()
  File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\__init__.py", line 2682, in get
    return self.tk.call(self._w, 'get')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte

Я осознаю, что проблема возникает в строке:

data = entry_field.get()

Но я не может придумать решение.

1 Ответ

0 голосов
/ 26 января 2020

Ошибка в том, что python использует utf-8, а emojis использует другой код c, вот что я нашел для вас: https://pypi.org/project/emoji-encoding/. Если вы хотите изменить кодировку самостоятельно, вот такой вопрос, который я нашел Изменение кодировки по умолчанию Python? .

РЕДАКТ. 1:

Откройте код в блокноте затем нажмите «Файл», затем «Сохранить как», затем «Кодировка: ANSI», затем нажмите UTF-8, затем подтвердите «Да».

Вы можете удалить часть кода, чтобы декодировать эмодзи, потому что python уже делает это за вас:)

(извините за глупый первый ответ, кстати)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...