Search code examples
python-2.7gtk3

GTK3 render text in TreeView for RTL languages like Hebrew


I am trying to render text in the TreeView for Hebrew Language.

Since the Hebrew text is from RTL (Right to Left Language) I am using a marker '\u200f' to make the text appear from right to left.

Below is the code where I am trying to render the Hebrew text

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

Need help to render the text from Right to Left in the Tree View


Solution

  • You can not set a CellRenderer's property directly, like you do in commented lines. Instead, you set TreeColumn's attribute, which tells renderer, where it can get value for property. Thus, you should add extra fields in your liststore and put xalign value there.

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

    tested only on python 3