Текстовый виджет tkinter как html - PullRequest
0 голосов
/ 21 октября 2018

Я создал приложение tkinter для отправки электронной почты.Тело электронной почты должно получить текст с форматированием / стилем из текстового виджета.Есть ли способ сделать то же самое.

метод get предоставляется только текст, но не стиль / форматирование.

1 Ответ

0 голосов
/ 21 октября 2018

Текстовый виджет имеет метод с именем dump, который может сериализовать все в текстовом виджете.Возвращает список кортежей.Каждый кортеж будет иметь форму (ключ, значение, индекс). ключ будет одним из следующих: text, mark, tagon, tagoff, image или window.Значение будет зависеть от ключа.Например, с tagon и tagoff значением будет имя тега.Для text это текст.

Рассмотрим текстовый виджет с тегами «b» для жирного шрифта и «h1» для заголовка.Это может выглядеть примерно так:

enter image description here

Когда вы вызываете метод dump (например, self.text.dump("1.0", "end")), вы получите что-то вродеследующее:

(
    ('mark', 'current', '1.0'),
    ('tagon', 'h1', '1.0'),
    ('text', 'Hello, world!', '1.0'),
    ('tagoff', 'h1', '1.13'),
    ('text', '\n', '1.13'),
    ('text', '\n', '2.0'),
    ('text', 'this is a test with some ', '3.0'),
    ('tagon', 'b', '3.25'),
    ('text', 'bold text', '3.25'),
    ('tagoff', 'b', '3.34'),
    ('text', '.', '3.34'),
    ('mark', 'insert', '3.35'),
    ('text', '\n', '3.35'),
)

Программа преобразования просто должна зациклить эти данные и обработать каждый ключ.Если вы используете имена тегов, которые соответствуют HTML-тегам (например: "b", "h1" и т. Д.), Преобразование становится довольно простым.Это может выглядеть примерно так:

def convert(self):
    html = ""
    for (key, value, index) in self.text.dump("1.0", "end"):
        self.converted.insert("end", str((key, value, index)) + "\n")
        if key == "tagon":
            html += "<{}>".format(value)
        elif key == "tagoff":
            html += "</{}>".format(value)
        elif key == "text":
            html += value

Выше приведено что-то вроде этого для окна примера:

<h1>Hello, world!</h1>
this is a test with some <b>bold text</b>.

Вам придется добавить дополнительный код для обработки абзацев, так какdump метод возвращает только строки, а не теги для каждого абзаца, но в остальном это довольно простой алгоритм.

...