Nano Hash - криптовалюты, майнинг, программирование

Использование разметки с Gtk.TextView

Я пытался найти способ использовать разметку Pango с Gtk.TextView и Gtk.TextBuffer в Python GObject, но похоже, что эта функция доступна только для всплывающих подсказок и меток. Gtk.TextBuffer имеет insert_markup метод, но требует Gtk.TextIter в качестве входных данных и должен иметь указанную длину.

Проблема здесь в том, что я хочу использовать Gtk.TextView только для отображения текста без возможности редактирования. Поэтому, хотя я думаю, что понял, как вы используете Gtk.TextTag с редактируемым/выбираемым текстом, чтобы существенно изменить его внешний вид (и даже поведение), я не совсем уверен, как вы делаете то же самое со статическим текстом. Каков самый простой способ применить разметку к таким?

Например: преобразование «‹b>Некоторый текст‹/b>» в «Некоторый текст» (или любой другой тег, который будет использоваться)


  • Как сказано в документах для insert_markup, вы можете использовать -1 для длины и получить textiter, например, с Gtk.TextBuffer.get_start_iter(). Я не понимаю вашей проблемы с таким подходом. 04.01.2017
  • Я не знаю, как поставить Gtk.TextIter перед ‹b› и в конце ‹/b› — это проблема. Я прекрасно понимаю концепцию отношений между Gtk.TextBuffer, Gtk.TextTag и Gtk.TextIter, в противном случае, я думаю, но это кажется более сложным, когда текст доступен только для чтения. Я надеюсь, что это сделает его более полным. 04.01.2017
  • Но если вы хотите показать весь текст с примененной разметкой, вам не нужно ставить TextIter перед отдельными тегами разметки. 04.01.2017
  • Ааа, теперь это имеет гораздо больше смысла. Я знал, что было что-то очевидное, что мне не хватало. Я хотел бы отметить ваш комментарий как ответ. Большое спасибо, это прояснило. 04.01.2017
  • Я не понимаю, мой ответ не отвечает на ваш вопрос? Даже с полным запущенным примером? 07.01.2017

Ответы:


1

В учебнике Python GTK+ 3 есть хороший пример, TextView Пример

Но чтобы прояснить (надеюсь) важные части, как вы уже догадались, вам нужно использовать текстовые теги, вы должны определить их в TextBuffer, а не в TextView, например.

self.tag_bold = self.textbuffer.create_tag("bold", weight=Pango.Weight.BOLD)

а затем вы можете применить свой тег к части текста, которую вы хотите выделить жирным шрифтом, для этого вам нужно будет предоставить методу TextBuffer.apply_tag() границы (начало, конец) этой части текста, подобно:

start, end = self.textbuffer.get_selection_bounds()
self.textbuffer.apply_tag(self.tag_bold, start, end)

и у вас все будет готово.

В приведенном выше примере границы берутся частью текста, выбранного пользователем, но, конечно, если вы отображаете текст только для чтения, вы можете сами указать границы в коде, посмотрите документацию по TextBuffer.

Вы также можете добавить текст с валидной панго-разметкой методом:

self.textbuffer.insert_markup(iter, markup)

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

См. минимальный пример здесь ниже (вы можете сделать его лучше):

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Pango

class TextViewWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="TextView Example")

        self.set_default_size(-1, 350)

        self.grid = Gtk.Grid()
        self.add(self.grid)

        self.create_textview()

    def create_textview(self):
        scrolledwindow = Gtk.ScrolledWindow()
        scrolledwindow.set_hexpand(True)
        scrolledwindow.set_vexpand(True)
        self.grid.attach(scrolledwindow, 0, 1, 3, 1)

        self.textview = Gtk.TextView()
        self.textbuffer = self.textview.get_buffer()
        start_iter = self.textbuffer.get_start_iter()

        self.textbuffer.insert(start_iter, "This is some text ")
        self.textbuffer.insert_markup(self.textbuffer.get_end_iter(), "<b>and some bold text</b>", -1)

        scrolledwindow.add(self.textview)

win = TextViewWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
04.01.2017
  • Ах, да, наверное, мне следовало сказать, что я уже приходил примерно к такому же выводу раньше. Я задал более общий вопрос на случай, если я пропустил что-то более очевидное, что могут предложить ребята из Стека. Однако, если это единственный способ пометить текст, предназначенный только для чтения, в Gtk.TextBuffer, то я просто не знаю, как разместить Gtk.TextIter в нужных местах, чтобы пометить определенные части текста. 04.01.2017
  • Я добавил образец, используя итеры и установив разметку 04.01.2017
  • Молодец, жаль, что твой ответ не был принят, конечно, помог мне. 25.07.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..