Когда пользователь вводит эмодзи в виджет записи Tkinter, при вызове .get вызывается исключение. - PullRequest
0 голосов
/ 02 апреля 2020

Как я нашел из других вопросов здесь, в StackOverflow (см. здесь ), в Tkinter есть ошибка при использовании Unicode для Emojis.

Я реализовал функцию, которая исправляет отображение Unicode, так что я могу отображать эмодзи просто отлично, используя Tkinter. Однако Tkinter по-прежнему выдает исключение, когда я пытаюсь получить текст из виджета ввода (текстового поля), который содержит смайлики, говорящие о том, что он не может декодировать строку utf-8.

Я подозреваю, что смогу обойти это, используя tk.call для прямого доступа к базовому интерпретатору Tcl, поскольку другой вопрос заставляет меня думать, что ошибка в Tkinter, а не в Tcl. Я не знаю, какой-либо Tcl не смог найти документацию о том, как использовать tk.call ... Я иду по правильному пути или есть лучшее решение?

Вот трассировка стека для cra sh:


Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/phili/PycharmProjects/pychat\gui.py", line 61, in __send
    self.add_message('You: ' + replace_emoji(self.__msg_entry.get()))
  File "C:\Program Files (x86)\Python37-32\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

1 Ответ

1 голос
/ 02 апреля 2020

Это известная очень давняя ошибка (которую сложно исправить, потому что она тонко разбивает кучу предположений), и она вызвана базовыми библиотеками (Tcl и Tk), поддерживающими только Basi c Многоязычная плоскость Unicode (эмодзи не включены). Мы надеемся найти обходной путь после выпуска Tk 8.7.

В самом Tkinter также могут быть проблемы, которые усугубляют это.


Я рассмотрел этот вопрос подробнее, и он выглядит как на месте для 8,7 , так как можно увидеть . Я не уверен на 100%, есть ли он в Tk (временная шкала ветки 1011 * указывает, что, возможно, нет), но это не изменение API, так что это не должно быть сложно; там есть некоторые предупреждения, но я полагаю, что они будут полностью отсортированы для 8.7.

Также есть некоторый прогресс , сделанный на этом также для 8.6. Тем не менее, он использует нестандартный режим сборки для Tcl (определяющий TCL_UTF_MAX=4), так что вряд ли он будет вообще применим для Tkinter в 8.6, тогда как в 8.7 для Tkinter будет практично строить поверх него (и ошибок). станет их проблемой).

...