Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GTK3 - Python Treeview Filter Function

I have a simple GTK3 GUI with a treeview and treestore. I need to filter the column with data3 string and show only data3 row. But it also hides data3 row. Because parent row of the data3 column is also hidden.

It works when I use return model[iter][2] == "data2" instead of return model[iter][2] == "data3".

All of the rows could be viewed by commenting out this line: filter1.set_visible_func(filter1_func)

How could I fix this?

Simplified code:

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

builder = Gtk.Builder()
builder.add_from_file('test.glade')
builder.get_objects()
window1 = builder.get_object('window1')
treeview1 = builder.get_object('treeview1')

class Signals:
    def on_window1_destroy(self, widget):
        Gtk.main_quit()

def filter1_func(model, iter, data):
    return model[iter][2] == "data3"

list_data = [["text1", "data1", "data2"], ["text2", "data1", "data2"], ["text3", "data1", "data3"]]

treestore1 = Gtk.TreeStore(str, str, str)
piter1 = treestore1.append(None, list_data[0])
piter2 = treestore1.append(piter1, list_data[1])
piter3 = treestore1.append(piter1, list_data[2])

treeview1.set_model(treestore1)
filter1 = treestore1.filter_new()
filter1.set_visible_func(filter1_func)
filter1.refilter()

for i, column_title in enumerate(["col1", "col2", "col3"]):
    renderer = Gtk.CellRendererText()
    column = Gtk.TreeViewColumn(column_title, renderer, text=i)
    treeview1.append_column(column)

treeview1.set_model(filter1)
treeview1.expand_all()

builder.connect_signals(Signals())
window1.show_all()
Gtk.main()
like image 252
demirod Avatar asked Mar 26 '26 09:03

demirod


1 Answers

Have you tried the method in the last example of the link?

A treeview with a liststore is used in the example and treeview is updated with a function with a liststore filter. You may try modifying the code for your need (treeview with treestore).

Note: It is for liststore. I do not know if it works for a treeview with liststore. You may try updating your treeview with treestore by updating the entire model, but this may be computationally expensive.

like image 143
pythonlearner9001 Avatar answered Mar 28 '26 22:03

pythonlearner9001



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!