在Gtk.TextView中使用标记

时间:2017-01-03 20:52:44

标签: python user-interface gtk pygtk pygi-aio

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

这里的问题是我只想使用Gtk.TextView来显示文本,而不是可编辑的。因此,虽然我认为我理解你如何使用Gtk.TextTag可编辑/可选文本来大幅改变其外观(甚至行为),但我不完全确定你如何对静态文本做同样的事情。将标记应用于此类的最简单方法是什么?

例如:转动“< b>一些文字< / b>”进入“一些文字”(或使用哪个标签)

1 个答案:

答案 0 :(得分:4)

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

但为了使重要部分更清晰(希望如此),正如您猜测必须使用文本标签,您必须在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文档。 / p>

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

self.textbuffer.insert_markup(iter, markup)

如果方法可以返回指向插入文本末尾的新iter会更好,这会使生活变得更容易,但是方法来自简单的内省,它需要覆盖才能这样做。< / p>

请参阅下面的最小示例(您可以更好地使用它):

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()