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 警告