Skip to content

Instantly share code, notes, and snippets.

@koohz
Last active February 10, 2021 14:01
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koohz/8059747 to your computer and use it in GitHub Desktop.
Save koohz/8059747 to your computer and use it in GitHub Desktop.
A PyGtk example for filtering multiple columns in a TreeView
#!/usr/bin/python
from gi.repository import Gtk
import random
DUMMY_WORDS = '''Omnisciently sepulture innervating reducate louden fleming
psoatic opinionatedly upington unmistrusted psychognosis
jackfish tutankhamen piled Hyperpotassemia schopenhauerism
venomness grendel bleakly unbungling dolius proempiricist
ableptically siniju woolley giulietta semisentimentalized
tolerably Moultrie prelawful prague mangler gainfulness
emerize pleomorphism filtrated cellule dichotomizing cade
melodie pretermitted pyelonephritis. Anthodium hyphopodium
leady midget balkiness metonym euctemon dissidence sulphurise
uninterpretable loveliness garrotter moue mechitzah
Nonsolvency reef pyre skuld dysgraphia heavenwardness
menstruated coulee underutilization magnoliaceous
undisinheritable unemasculated monoacid'''.split()
class MyWindow(Gtk.Window):
def __init__(self):
# Window
Gtk.Window.__init__(self, title="Hello World")
self.set_size_request(800, 500)
self.set_position(Gtk.WindowPosition.CENTER)
self.set_resizable(True)
self.set_border_width(10)
# Models
self.model = Gtk.ListStore(bool, str, str, str, str)
self.filter = self.model.filter_new()
for i in range(10):
self.populate_store()
# Boxes
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
vbox.set_homogeneous(False)
hbox = Gtk.Box(Gtk.Orientation.VERTICAL)
hbox.set_homogeneous(False)
vbox.pack_start(hbox, False, True, 0)
self.add(vbox)
# Search Entry
self.entry = Gtk.Entry()
self.entry.set_placeholder_text("Type to filter...")
self.entry.connect("changed", self.refresh_filter)
hbox.pack_start(self.entry, True, True, 0)
# Search Combo
categories = ["All", "Color", "Size", "Price", "Rating"]
self.catcombo = Gtk.ComboBoxText()
self.catcombo.set_entry_text_column(0)
self.catcombo.connect("changed", self.refresh_filter)
hbox.pack_start(self.catcombo, False, False, 0)
for cat in categories:
self.catcombo.append_text(cat)
self.catcombo.set_active(0)
self.filter.set_visible_func(self.visible_cb)
# TreeView
self.treeview = Gtk.TreeView(model=self.filter)
# CellRenderers
textrend = Gtk.CellRendererText()
togrend = Gtk.CellRendererToggle()
# Columns
active = Gtk.TreeViewColumn("Active", togrend, active=0)
color = Gtk.TreeViewColumn("Color", textrend, text=1)
size = Gtk.TreeViewColumn("Size", textrend, text=2)
price = Gtk.TreeViewColumn("Price", textrend, text=3)
rating = Gtk.TreeViewColumn("Rating", textrend, text=4)
self.treeview.append_column(active)
self.treeview.append_column(color)
self.treeview.append_column(size)
self.treeview.append_column(price)
self.treeview.append_column(rating)
# Scrolled Window
self.sw = Gtk.ScrolledWindow()
self.sw.add(self.treeview)
vbox.pack_start(self.sw, True, True, 1)
def populate_store(self):
for i in range(10):
booly = [bool(random.getrandbits(1))]
words = [random.choice(DUMMY_WORDS) for i in range(4)]
values = booly + words
self.model.append(values)
def refresh_filter(self,widget):
self.filter.refilter()
def visible_cb(self, model, iter, data=None):
search_query = self.entry.get_text().lower()
active_category = self.catcombo.get_active()
search_in_all_columns = active_category == 0
if search_query == "":
return True
if search_in_all_columns:
for col in range(1,self.treeview.get_n_columns()):
value = model.get_value(iter, col).lower()
if value.startswith(search_query):
return True
return False
value = model.get_value(iter, active_category).lower()
return True if value.startswith(search_query) else False
win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment