在Gtk.TextView中使用标记

Hol*_*bau 1 python gtk user-interface pygtk pygi-aio

我一直在尝试找到在Python GObject中Gtk.TextView和一起使用Pango标记的方法,但似乎此功能仅适用于工具提示和标签。具有方法,但需要作为输入,并且必须具有指定的长度。Gtk.TextBufferGtk.TextBufferinsert_markupGtk.TextIter

这里的问题是我只想Gtk.TextView显示文本而不能编辑。因此,尽管我认为我了解您如何使用Gtk.TextTag可编辑/可选文本来实质性地更改其外观(甚至行为),但我不确定完全如何处理静态文本。对此类应用标记的最简单方法是什么?

例如:将“ <b>某些文本</ b>”转换为“ 某些文本 ”(或使用哪个标签)

gia*_*nmt 6

Python GTK + 3教程中有一个很好的示例,TextView示例

但是要想弄清楚(希望)在重要部分上,如您所料,您必须使用文本标签,则必须在TextBuffer中而不是在TextView中定义它们,例如

self.tag_bold = self.textbuffer.create_tag("bold", weight=Pango.Weight.BOLD)
Run Code Online (Sandbox Code Playgroud)

然后您可以将标签应用于要加粗的文本部分,为此,您必须向TextBuffer.apply_tag()方法提供该文本部分的边界(开始,结束),喜欢:

start, end = self.textbuffer.get_selection_bounds()
self.textbuffer.apply_tag(self.tag_bold, start, end)
Run Code Online (Sandbox Code Playgroud)

这样您就会准备就绪。

在上面的示例中,边界由用户选择的文本部分确定,但是,如果您要显示只读文本,则可以在代码中自行提供边界,请查看TextBuffer文档。

您还可以通过以下方法添加具有有效pango标记的文本:

self.textbuffer.insert_markup(iter, markup)
Run Code Online (Sandbox Code Playgroud)

如果该方法可以返回指向插入文本末尾的新iter,那将是一件很不错的事情,这将使工作更加轻松,但是该方法来自普通的自省,因此需要进行覆盖才能实现。

请参阅下面的最小示例(您可以使其变得更好):

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()
Run Code Online (Sandbox Code Playgroud)