GTK3 在 TreeView 中为 RTL 语言(如希伯来语)渲染文本

Posted

技术标签:

【中文标题】GTK3 在 TreeView 中为 RTL 语言(如希伯来语)渲染文本【英文标题】:GTK3 render text in TreeView for RTL languages like Hebrew 【发布时间】:2018-04-19 10:10:53 【问题描述】:

我正在尝试在 TreeView 中为希伯来语呈现文本。

由于希伯来语文本来自 RTL(从右到左语言),我使用标记“\u200f”使文本从右到左显示。

下面是我尝试渲染希伯来语文本的代码

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

class CellRendererTextWindow(Gtk.Window):

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

        self.set_default_size(200, 200)
        a = u'\u200f\u202b<span float="right" foreground="black">\u05d1\u05d5\u05d0\u05d5 \u05d9\u05d7\u05d3 \u05d0\u05e8\u05d5\u05d7\u05ea \u05e6\u05d4\u05e8\u05d9\u05d9\u05dd</span>\u202c'
        self.liststore = Gtk.ListStore(str, str)

        treeview = Gtk.TreeView(model=self.liststore)

        renderer_text = Gtk.CellRendererText()
        #renderer_text.set_property("xalign", 1.0)
        #renderer_text.set_property("ellipsize", Pango.EllipsizeMode.START)


        column_text = Gtk.TreeViewColumn("Text", renderer_text, text=0)
        treeview.append_column(column_text)

        renderer_editabletext = Gtk.CellRendererText()
        renderer_editabletext.set_property("editable", True)

        column_editabletext = Gtk.TreeViewColumn("Editable Text",
            renderer_editabletext, text=1)
        treeview.append_column(column_editabletext)

        renderer_editabletext.connect("edited", self.text_edited)

        textview = Gtk.TextView()
        textbuffer = textview.get_buffer()
        textbuffer.set_text(a)

        self.liststore.append(["Test", a])
        self.liststore.append([a, "http://fedoraproject.org/"])
        self.liststore.append(["Slackware"*10, "http://www.slackware.com/"])
        self.liststore.append(["Sidux", "http://sidux.com/"])

        self.add(treeview)

    def text_edited(self, widget, path, text):
        self.liststore[path][1] = text

win = CellRendererTextWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

需要帮助才能在树视图中从右到左呈现文本

【问题讨论】:

具体的问题是什么?文本如何呈现或如何对齐 所以目前 ListStore 中的文本是从左到右对齐的。问题是我希望文本从右到左对齐,这没有发生。我正在尝试将文本与此标记“\u200f”对齐,理想情况下将文本从右向左对齐 您尝试将文本右对齐,\u200f 理想地解决了问题,问题是什么?你想对齐没有这个符号的文本吗? 所以问题是标记“\u200f”根本不起作用 【参考方案1】:

您不能像在注释行中那样直接设置CellRenderer 的属性。相反,您设置TreeColumn 的属性,它告诉渲染器,它可以从哪里获取属性值。因此,您应该在列表存储中添加额外的字段并将xalign 值放在那里。

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

class CellRendererTextWindow(Gtk.Window):

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

        self.set_default_size(200, 200)
        a = u'<span lang="he" foreground="black">abc \u05d1\u05d5\u05d0\u05d5 \u05d9\u05d7\u05d3 \u05d0\u05e8\u05d5\u05d7\u05ea \u05e6\u05d4\u05e8\u05d9\u05d9\u05dd</span>\u202c'

        self.liststore = Gtk.ListStore(str, str, float, str)

        treeview = Gtk.TreeView(model=self.liststore)

        renderer_text = Gtk.CellRendererText()
        column_text = Gtk.TreeViewColumn("text", renderer_text)
        column_text.add_attribute (renderer_text, "markup", 0)
        column_text.add_attribute(renderer_text, "xalign", 2)
        column_text.add_attribute(renderer_text, "background", 3)
        treeview.append_column(column_text)


        rend_editable = Gtk.CellRendererText()
        rend_editable.set_property("editable", True)

        column_editabletext = Gtk.TreeViewColumn("Editable Text", rend_editable)
        column_editabletext.add_attribute(rend_editable, "text", 1)
        treeview.append_column(column_editabletext)

        rend_editable.connect("edited", self.text_edited)

        textview = Gtk.TextView()
        textbuffer = textview.get_buffer()
        textbuffer.set_text(a)

        self.liststore.append(["Test", a, 1.0, "white"])
        self.liststore.append([a, "http://fedoraproject.org/", 1.0, "red"])
        self.liststore.append(["Slackware" * 6, "http://www.slackware.com/", 0.5, "green"])
        self.liststore.append(["Sidux", "http://sidux.com/", 0.5, "blue"])

        self.add(treeview)

    def text_edited(self, widget, path, text):
        self.liststore[path][1] = text

win = CellRendererTextWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

仅在 python 3 上测试过

【讨论】:

以上是关于GTK3 在 TreeView 中为 RTL 语言(如希伯来语)渲染文本的主要内容,如果未能解决你的问题,请参考以下文章

“将大小分配给...”在 Gtk.ScrolledWindow 中使用 Gtk.TreeView 时出现 GTK 警告

如何在 WatchKit 中检查 RTL 语言

无法在 Python 中显示 TreeView

iOS 应用程序不会更改为 RTL 语言

用于 RTL 语言的 Twitter Bootstrap 拉右和拉左

如何使用 Cairo 和 Gtk3 在 GtkDrawingArea 中绘制一条线