Last active
February 10, 2021 14:01
-
-
Save koohz/8059747 to your computer and use it in GitHub Desktop.
A PyGtk example for filtering multiple columns in a TreeView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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