Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GTK - Python Treeview Separator Function

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?

like image 470
pythonlearner9001 Avatar asked Jul 13 '26 15:07

pythonlearner9001


1 Answers

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()
like image 182
theGtknerd Avatar answered Jul 16 '26 05:07

theGtknerd