python 在GtkSourceView中使用字符换行时不要插入连字符

nkhmeac6  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(147)

我有一个GtkSource.View,它的换行模式设置为Gtk.WrapMode.CHAR。当它换行时,它会在行尾插入-。如何防止这种情况?
在我的研究中,我发现Pango库有一个attr_insert_hyphens_new(False)函数,它返回一个Pango.Attribute,但我不明白您打算如何使用这些Pango属性。
当前代码:

view = GtkSource.View()
view.set_wrap_mode(Gtk.WrapMode.CHAR)

context = view.get_pango_context()
attrList = Pango.AttrList()
layout = Pango.Layout(context)

attr = Pango.attr_insert_hyphens_new(False)
attr.start_index = Pango.ATTR_INDEX_FROM_TEXT_BEGINNING
attr.end_index = Pango.ATTR_INDEX_TO_TEXT_END
attrList.insert(attr)
layout.set_attributes(attrList)
ru9i0ody

ru9i0ody1#

您必须从上下文中获取pango属性列表,然后将新属性插入到列表中。
在我对另一个问题的回答中有一个例子,其中插入了形状属性。

PangoContext    *ctxt = gtk_widget_get_pango_context (pWidget);
  PangoAttrList   *attList = pango_attr_list_new();
  PangoAttribute  *attr;
  PangoLayout     *Pango = pango_layout_new (ctxt);

  attr = pango_attr_shape_new_with_data(&r, &r, pImg, NULL, NULL);
  attr->start_index = 0; attr->end_index = 1;
  pango_attr_list_insert (attList, attr);
  pango_layout_set_attributes (Pango, attList);
uxh89sit

uxh89sit2#

遇到了同样的问题,
我发现了两种避免连字符的方法。
//似乎都需要gtk 4

A. pango标记insert_hyphens属性

需要Pango〉= 1.44
https://docs.gtk.org/Pango/pango_markup.html#:~:text=insert_hyphens
注:堆栈溢出逃脱的网址,你最好复制到位置(而不是点击),以锚到关键字。
甚至pygtk与Pango 1.50
没有运行时错误,但似乎没有影响gtk 3。
(也许GTK 3没有处理好)

B. Gtk.文本标记:插入连字符

需要gtk 4
https://docs.gtk.org/gtk4/class.TextTag.html#properties:~:text=TextTag%3Ainsert%2Dhyphens
gtk 3将得到错误:
类型错误:对象GtkTextTag' doesn't support property插入连字符'

演示代码

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

# set text without hyphens by markup
def test_markup(tb: Gtk.TextBuffer):
    # insert-hyphens='no' or insert_hyphens='false' both work
    s = '123 aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbb ccccccccccccccc ddddddddd'
    s = '<span insert-hyphens="no" color="green">' + s + '</span>'
    # tb.set_text(s)
    tb.insert_markup(tb.get_end_iter(), s, -1)

# set text without hyphens by textTag
def test_tag(tb: Gtk.TextBuffer):
    s = '456 aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbb ccccccccccccccc ddddddddd'
    tb.set_text(s)
    tag1 = tb.create_tag("test1", foreground="red", insert_hyphens=False)
    tb.apply_tag(tag1, tb.get_start_iter(), tb.get_end_iter())
    # tb.apply_tag(tag1, tb.get_start_iter(), tb.get_iter_at_offset(3))

def on_activate(app):
    win = Gtk.ApplicationWindow(application=app)

    tv: Gtk.TextView = Gtk.TextView.new()
    tv.set_size_request(150, 50)
    tv.set_wrap_mode(Gtk.WrapMode.CHAR)

    tb: Gtk.TextBuffer = tv.get_buffer()

    test_markup(tb)
    # test_tag(tb)

    box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
    box.append(tv)
    box.set_size_request(400, 300)
    box.append(Gtk.Button(label="hello"))

    win.present()
    win.set_child(box)

app = Gtk.Application()
app.connect('activate', on_activate)
app.run(None)

相关问题