将pango标记字符串转换为GtkTextTag属性

2024-10-01 05:05:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个gtk.TextView,我想在其中添加类似标记的文本。我知道这可以通过使用gtk.TextTag来实现,您可以使用类似于pango标记字符串的属性来创建它。我注意到,没有一种简单的方法可以简单地将setumarkup设置为gtk.TextBuffer,就像您可以使用多个其他小部件一样。相反,您必须创建一个TextTag,赋予它属性,然后将它插入到TextBuffer的TagTable中,指定标记应用于的iter。在

理想情况下,我希望创建一个函数,可以将pango标记字符串转换为TextTag以获得相同的效果。但gtk似乎没有内置的功能。 我注意到,您可以在一个已标记的字符串上使用pango.parse_markup(),它将创建一个pango.AttributeList,其中包含有关字符串上设置的属性及其出现的索引的信息。但是每种类型的属性都有细微的差别,这使得很难对每种情况进行概括。有更好的办法吗?或者pango标记不是要转换成gtk.TextTag的?在


Tags: 方法字符串标记文本gtk属性部件情况
2条回答

没有跟踪GTK+的开发,可能他们最近添加了一些东西,但是看到了这些错误:#59390和{a2}。因为他们没有关闭,很可能什么也没做。在

我终于想出了自己解决这个问题的办法。我创建了一个解析标记字符串的函数(使用pango.parse_markup)。通过阅读文档和python自省,我能够找到如何使用pango.Attribute并将其转换为GtkTextTag可以使用的属性。在

函数如下:

def parse_markup_string(string):
    '''
    Parses the string and returns a MarkupProps instance
    '''
    #The 'value' of an attribute...for some reason the same attribute is called several different things...
    attr_values = ('value', 'ink_rect', 'logical_rect', 'desc', 'color')

    #Get the AttributeList and text
    attr_list, text, accel = pango.parse_markup( string )
    attr_iter = attr_list.get_iterator()

    #Create the converter
    props = MarkupProps()
    props.text = text

    val = True
    while val:
            attrs = attr_iter.get_attrs()

            for attr in attrs:
                    name = attr.type
                    start = attr.start_index
                    end = attr.end_index
                    name = pango.AttrType(name).value_nick

                    value = None
                    #Figure out which 'value' attribute to use...there's only one per pango.Attribute
                    for attr_value in attr_values:
                            if hasattr( attr, attr_value ):
                                    value = getattr( attr, attr_value )
                                    break

                    #There are some irregularities...'font_desc' of the pango.Attribute
                    #should be mapped to the 'font' property of a GtkTextTag
                    if name == 'font_desc':
                            name = 'font'
                    props.add( name, value, start, end )

            val = attr_iter.next()

    return props

此函数创建一个MarkupProps()对象,该对象能够生成GtkTextTag以及文本中要应用它们的索引。在

目标是:

^{pr2}$

因此,通过这个函数和MarkupProps对象,我能够在给定一个pango标记字符串的情况下,将该字符串分解为它的属性和文本形式,然后将其转换为GtkTextTags

相关问题 更多 >