I need to show separator between rows of the GTK3 treeview, but it gives error. I have read the documentation but I could not fix it I could not find an example for this function on the web.
To be able to see the working version of the code (without separator), toggle comment for the treeview1.set_model(treestore1) line and comment out the following three code lines.
Here is the simplified code (Python 3.7):
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
builder = Gtk.Builder()
builder.add_from_file('test1.glade')
window1 = builder.get_object('window1')
treeview1 = builder.get_object('treeview1')
class Signals:
def on_window1_destroy(self, widget):
Gtk.main_quit()
# First column of the data is for separator function
list_data = [[False, "text1", "data1"],
[True, "text2", "data1"],
[False, "text4", "data5"]]
treestore1 = Gtk.TreeStore(bool, str, str)
piter1 = treestore1.append(None, list_data[0])
piter2 = treestore1.append(None, list_data[1])
piter3 = treestore1.append(None, list_data[2])
#treeview1.set_model(treestore1)
# Following three lines are added for separator function
iter = treestore1.get_iter(2)
sep_func = Gtk.TreeViewRowSeparatorFunc(treestore1, iter, data=0)
treeview1.set_model(Gtk.TreeModelSort(model=sep_func))
for i, column_title in enumerate(["col1", "col2"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i+1)
treeview1.append_column(column)
treeview1.expand_all()
builder.connect_signals(Signals())
window1.show_all()
Gtk.main()
Here is the Glade (test1.glade) file.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="default_width">300</property>
<property name="default_height">300</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkTreeView" id="treeview1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
</child>
</object>
</interface>
Here is the shortened error:
Traceback (most recent call last):
.
.
.
File "/home/user/.local/lib/python3.7/site-packages/gi/module.py", line 218, in __getattr__
raise NotImplementedError(info)
NotImplementedError: gi.CallbackInfo(TreeViewRowSeparatorFunc)
How separate function for treeview rows could be written in a correct way?
The TreeViewRowSeparatorFunc is merely a type definition used in the C language. In Python, we don't use this, instead we use a normal function that returns whether the row should be a separator. This problem had me scratching my head for a bit.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
builder = Gtk.Builder()
builder.add_from_file('test1.glade')
window1 = builder.get_object('window1')
treeview1 = builder.get_object('treeview1')
class Signals:
def on_window1_destroy(self, widget):
Gtk.main_quit()
# First column of the data is for separator function
list_data = [[False, "text1", "data1"],
[True, "text2", "data1"],
[False, "text4", "data5"]]
treestore1 = Gtk.TreeStore(bool, str, str)
piter1 = treestore1.append(None, list_data[0])
piter2 = treestore1.append(None, list_data[1])
piter3 = treestore1.append(None, list_data[2])
# Following lines are added for separator function
def separator_function (model, iter_):
return model[iter_][0]
treeview1.set_row_separator_func (separator_function)
treeview1.set_model(treestore1)
for i, column_title in enumerate(["col1", "col2"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i+1)
treeview1.append_column(column)
treeview1.expand_all()
builder.connect_signals(Signals())
window1.show_all()
Gtk.main()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With