Seite 1 von 1

Filter nach Text mit ViewTree

Verfasst: Montag 20. Mai 2013, 14:06
von martinjo
Hallo,

ich habe eine CSV Datei mit Paketsendungen. Diese lasse ich mir in einem GTK TreeView anzeigen, Felder sind Zeilennummer, Name, Datum und ein paar mehr.

Nun möchte ich gerne einen Filter setzen, dazu habe ich ein Entry-Feld sowie einen Suchen Knopf (der soll später weg da direkt beim Eintippen gesucht werden soll aber vorerst zum testen ist er ganz nützlich).

Ich möchte nun anhand der zweite Spalte, welche die Namen enthält filtern. Ich schaffe es aber nicht. Habe schon ein Problem den Filter-Begriff zu übergeben: "search_name_entry.get_text()"

Code: Alles auswählen

self.modelfilter.set_visible_func(self.search_name, self.search_name_entry.get_text())
Obwohl ich nochmal viel zum Thema gelesen habe bin ich schon wieder sehr lange an dem Thema dran.

Beispieldatei war http://pygtk.org/pygtk2tutorial/example ... lfilter.py

der Code ist hier http://pastebin.com/yjjTfYQK

Freue mich über jede Hife. Vorerst will ich nur über die eine Spalte (Name), entweder live oder über den Knopf nach dem Suchbegriff filtern.

Zweiter Schritt soll dann sein, dass ich noch mit einem zweiten Entry nach Beispielsweise "Straßenname" (Spalte6) suchen kann.

Re: Filter nach Text mit ViewTree

Verfasst: Montag 20. Mai 2013, 20:22
von martinjo
Also wenn ich das Suchwort direkt der Funktion übergebe funktioniert der Filter. Ich möchte jedoch als Suchwort immer den Inhalt des Entry Feldes verwenden.

Also das hier funktioniert:

Code: Alles auswählen

        # make filter
        self.modelfilter.set_visible_func(self.search_name, "Winter")    

Der Code im vorherigen Beitrag ist der, den ich drin stehen habe, da bekomme ich allerdings nie einen Wert geliefert.

Das Suchfeld definiere ich so:

Code: Alles auswählen

        # add a namesearch entry
        self.search_name_entry = gtk.Entry()
        self.search_name_entry.connect("changed", self.search_name)

nebenbei, wer Interesse hat solche Sachen und kleinere Projekte auf Rechnung zu machen, ich suche, PN an mich...

Re: Filter nach Text mit ViewTree

Verfasst: Freitag 20. Dezember 2013, 16:39
von martinjo
Heute wollte ich das Thema noch mal angehen, aber auch beim zweiten Versuch bin ich gescheitert.

Es ist nun zwar möglich, direkt über die Tastatur nach einem Namen zu suchen, jedoch wird noch immer nicht nach dem Begriff gesucht den ich in das Textfeld eingeben.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-


import gtk
import csv

#Basisklasse
class Base:
    # definiert das beenden
    def destroy(self, widget, data=None):
        gtk.main_quit()

    # visibility determined by state matching active toggle buttons
    def visible_func(self, model, iter, data):
        query = self.textbox.get_text()
        value = model.get_value(iter, 0)
        if query == "":
            return True
        elif query in value.lower():
            return True
        return False

    def on_entry_refilter(self, widget, data=None):
        self.modelfilter.refilter()


    def load(self, widget):
        bankfile = [["transactionId","localBankCode","localAccountNumber","remoteBankCode","remoteAccountNumber","date","valutadate","value_value","value_currency","localName","remoteName","remoteName1","purpose","purpose1","purpose2","purpose3","purpose4","purpose5","purpose6","purpose7","purpose8","purpose9","purpose15","purpose11","category","category1","category2","category3","category4","category5","category6","category7"],["","55515555","38163555","98757895798","654364356","2513/59/12","2513/59/12","155.55","EUR","tester","Peter","","ReferenzNOTPROVIDED","Verwendungszweck","Bestellung","11.59.13","","","","","","","","","","","","","","","",""],["","55515555","38163555","987578975","53465436354","2513/59/12","2513/59/12","43.55","EUR","tester","Ralf","","geschenk","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","97857895","54365436543","2513/59/12","2513/59/12","159.55","EUR","tester","Ines","","bestellung","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","9857895","54365436543","2513/59/13","2513/59/13","-7.94","EUR","tester","Frank","","2999552961781317","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","98578957","54365436543","2513/59/13","2513/59/13","-15.91","EUR","tester","Jonas","","2999519522912918","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","78957895","5465436354","2513/59/13","2513/59/13","-75.25","EUR","tester","Gerd","","2617393541155393","","","","","","","","","","","","","","","","","","",""]]
        if True:
            count = 0
            trans_list = []
            self.searchable_row_content = []
            for i in bankfile:
                trans_list.append(i)
                count += 1
                if count == 1:
                    self.liststore = gtk.ListStore(*[type(y) for y in i])
                    self.modelfilter = self.liststore.filter_new()

                else:
                    self.liststore.append([y for y in i])
                    self.searchable_row_content.append(i[10])
        
        self.modelfilter.set_visible_func(self.visible_func, self.searchable_row_content)
        self.liststore_sortable = gtk.TreeModelSort(self.liststore)
        self.treeview = gtk.TreeView(self.liststore_sortable)
        self.treeview.set_model(self.modelfilter)
             
        cell = gtk.CellRendererText()
        cell.set_property('editable', True)

        for n, i in enumerate(trans_list[0]):
            print n, i
            column = gtk.TreeViewColumn(i, cell, text=n)
            self.treeview.append_column(column)
            
        self.treeview.set_search_column(10)
        self.treeview.set_search_entry(self.textbox)
            
        self.main_sw.add_with_viewport(self.treeview)
        self.window.show_all()


    def __init__(self):
        #Fenster definieren
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_size_request(600, 400)
        self.window.set_title("This is the Title")
 
        #Load Knopf anlegen
        self.loadbutton = gtk.Button("Load")
        self.loadbutton.connect("clicked", self.load)

        #textbox
        self.textbox = gtk.Entry()
        self.textbox.connect("changed", self.on_entry_refilter)

        #Beenden Knopf anlegen
        self.exitbutton = gtk.Button("EXIT")
        self.exitbutton.connect("clicked", self.destroy)
        
        #scrolled window box
        self.main_sw = gtk.ScrolledWindow()

        #Hauptbox
        self.mainbox = gtk.VBox()
        self.mainbox.pack_start(self.textbox, expand=False)
        self.mainbox.pack_start(self.loadbutton, expand=False)
        self.mainbox.pack_start(self.main_sw)
        self.mainbox.pack_start(self.exitbutton, expand=False)

        #Hauptfenster
        self.window.add(self.mainbox)
        self.window.show_all()
        self.window.connect("destroy", self.destroy)

    def main(self):
        gtk.main()


if __name__ == "__main__":
    base = Base()
    base.main()

Re: Filter nach Text mit ViewTree

Verfasst: Mittwoch 15. Januar 2014, 02:08
von martinjo
Hier noch die korrigierte Version:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-
 
 
import gtk
import csv
 
#Basisklasse
class Base:
    # definiert das beenden
    def destroy(self, widget):
        gtk.main_quit()
 
    # visibility determined by state matching active toggle buttons
    def visible_func(self, model, iter, data=None):
        query = self.textbox.get_text()
        value = model.get_value(iter, 10)
        if query == "":
            return True
        elif query in value.lower():
            return True
        else:
            return False
 
    def on_entry_refilter(self, widget):
        self.modelfilter.refilter()
 
    def load(self, widget):
        bankfile = [["transactionId","localBankCode","localAccountNumber","remoteBankCode","remoteAccountNumber","date","valutadate","value_value","value_currency","localName","remoteName","remoteName1","purpose","purpose1","purpose2","purpose3","purpose4","purpose5","purpose6","purpose7","purpose8","purpose9","purpose15","purpose11","category","category1","category2","category3","category4","category5","category6","category7"],["","55515555","38163555","98757895798","654364356","2513/59/12","2513/59/12","155.55","EUR","tester","Peter","","ReferenzNOTPROVIDED","Verwendungszweck","Bestellung","11.59.13","","","","","","","","","","","","","","","",""],["","55515555","38163555","987578975","53465436354","2513/59/12","2513/59/12","43.55","EUR","tester","Ralf","","geschenk","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","97857895","54365436543","2513/59/12","2513/59/12","159.55","EUR","tester","Ines","","bestellung","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","9857895","54365436543","2513/59/13","2513/59/13","-7.94","EUR","tester","Frank","","2999552961781317","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","98578957","54365436543","2513/59/13","2513/59/13","-15.91","EUR","tester","Jonas","","2999519522912918","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","78957895","5465436354","2513/59/13","2513/59/13","-75.25","EUR","tester","Gerd","","2617393541155393","","","","","","","","","","","","","","","","","","",""]]
        count = 0
        trans_list = []
        self.searchable_row_content = []
        for i in bankfile:
            trans_list.append(i)
            count += 1
            if count == 1:
                self.liststore = gtk.ListStore(*[type(y) for y in i])
                self.modelfilter = self.liststore.filter_new()

            else:
                self.liststore.append([y for y in i])
                self.searchable_row_content.append(i[10])
       
        self.modelfilter.set_visible_func(self.visible_func, self.searchable_row_content)
        self.liststore_sortable = gtk.TreeModelSort(self.liststore)
        self.treeview = gtk.TreeView(self.liststore_sortable)
        self.treeview.set_model(self.modelfilter)
             
        cell = gtk.CellRendererText()
        cell.set_property('editable', True)
 
        for n, i in enumerate(trans_list[0]):
            print n, i
            column = gtk.TreeViewColumn(i, cell, text=n)
            self.treeview.append_column(column)
           
        self.treeview.set_search_column(10)
        self.treeview.set_search_entry(self.textbox)
           
        self.main_sw.add_with_viewport(self.treeview)
        self.window.show_all()
 
 
    def __init__(self):
        #Fenster definieren
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_size_request(600, 400)
        self.window.set_title("This is the Title")
 
        #Load Knopf anlegen
        self.loadbutton = gtk.Button("Load")
        self.loadbutton.connect("clicked", self.load)
 
        #textbox
        self.textbox = gtk.Entry()
        self.textbox.connect("changed", self.on_entry_refilter)
 
        #Beenden Knopf anlegen
        self.exitbutton = gtk.Button("EXIT")
        self.exitbutton.connect("clicked", self.destroy)
       
        #scrolled window box
        self.main_sw = gtk.ScrolledWindow()
 
        #Hauptbox
        self.mainbox = gtk.VBox()
        self.mainbox.pack_start(self.textbox, expand=False)
        self.mainbox.pack_start(self.loadbutton, expand=False)
        self.mainbox.pack_start(self.main_sw)
        self.mainbox.pack_start(self.exitbutton, expand=False)
 
        #Hauptfenster
        self.window.add(self.mainbox)
        self.window.show_all()
        self.window.connect("destroy", self.destroy)
 
    def main(self):
        gtk.main()
 
 
if __name__ == "__main__":
    base = Base()
    base.main()

Re: Filter nach Text mit ViewTree

Verfasst: Mittwoch 15. Januar 2014, 09:20
von Sirius3
@martinjo: Für die for-Schleife, Zeile 33ff, ist i ein sehr schlechter Name. Mit i verbindet man normalerweise einen Laufindex und keine Liste. trans_list wird nie verwendet und wenn Du einen Counter brauchst, kannst Du enumerate verwenden.
Soll der erste Eintrag einer Liste besonders behandelt werden, gibt es in Python eine elegante Lösung:

Code: Alles auswählen

bankfile = iter(bankfile)
header = next(bankfile)
self.liststore = gtk.ListStore(*[type(cell) for cell in header])
self.modelfilter = self.liststore.filter_new()
self.searchable_row_content = []
for row in bankfile:
    self.liststore.append(row)
    self.searchable_row_content.append(row[10])

Re: Filter nach Text mit ViewTree

Verfasst: Mittwoch 15. Januar 2014, 16:50
von martinjo
Hallo Sirius3, danke für die Hinweise, hier die verbesserte Version, bei dieser werden jetzt auch in 2 Zeilen nach dem Suchbegriff gesucht, in Name([10]) und Beschreibung([12]).

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-
 
 
import gtk
import csv
 
#Basisklasse
class Base:
    # definiert das beenden
    def destroy(self, widget):
        gtk.main_quit()
 
    # visibility determined by keyword
    def visible_func(self, model, iter, data=None):
        query = self.textbox.get_text()
        value1 = model.get_value(iter, 10)
        value2 = model.get_value(iter, 12)
        if query in value1.lower() or query in value2.lower():
            return True
        else:
            return False
 
    def on_entry_refilter(self, widget):
        self.modelfilter.refilter()
 
    def load(self, widget):
        bankfile = [["transactionId","localBankCode","localAccountNumber","remoteBankCode","remoteAccountNumber","date","valutadate","value_value","value_currency","localName","remoteName","remoteName1","purpose","purpose1","purpose2","purpose3","purpose4","purpose5","purpose6","purpose7","purpose8","purpose9","purpose15","purpose11","category","category1","category2","category3","category4","category5","category6","category7"],["","55515555","38163555","98757895798","654364356","2513/59/12","2513/59/12","155.55","EUR","tester","Peter","","ReferenzNOTPROVIDED","Verwendungszweck","Bestellung","11.59.13","","","","","","","","","","","","","","","",""],["","55515555","38163555","987578975","53465436354","2513/59/12","2513/59/12","43.55","EUR","tester","Ralf","","geschenk","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","97857895","54365436543","2513/59/12","2513/59/12","159.55","EUR","tester","Ines","","bestellung","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","9857895","54365436543","2513/59/13","2513/59/13","-7.94","EUR","tester","Frank","","2999552961781317","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","98578957","54365436543","2513/59/13","2513/59/13","-15.91","EUR","tester","Jonas","","2999519522912918","","","","","","","","","","","","","","","","","","",""],["","55515555","38163555","78957895","5465436354","2513/59/13","2513/59/13","-75.25","EUR","tester","Gerd","","2617393541155393","","","","","","","","","","","","","","","","","","",""]]
        bankfile = iter(bankfile)
        header = next(bankfile)
        self.liststore = gtk.ListStore(*[type(col) for col in header])
        self.modelfilter = self.liststore.filter_new()
        
        self.searchable_row_content = []
        for line in bankfile:
            self.liststore.append([y for y in line])
            self.searchable_row_content.append((line[10], line[12]))
       
        self.modelfilter.set_visible_func(self.visible_func, self.searchable_row_content)
        self.liststore_sortable = gtk.TreeModelSort(self.liststore)
        self.treeview = gtk.TreeView(self.liststore_sortable)
        self.treeview.set_model(self.modelfilter)
             
        cell = gtk.CellRendererText()
        cell.set_property('editable', True)
 
        for n, i in enumerate(header):
            print n, i
            column = gtk.TreeViewColumn(i, cell, text=n)
            self.treeview.append_column(column)
           
        self.treeview.set_search_column(10)
        self.treeview.set_search_entry(self.textbox)
           
        self.main_sw.add_with_viewport(self.treeview)
        self.window.show_all()
 
 
    def __init__(self):
        #Fenster definieren
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_size_request(600, 400)
        self.window.set_title("This is the Title")
 
        #Load Knopf anlegen
        self.loadbutton = gtk.Button("Load")
        self.loadbutton.connect("clicked", self.load)
 
        #textbox
        self.textbox = gtk.Entry()
        self.textbox.connect("changed", self.on_entry_refilter)
 
        #Beenden Knopf anlegen
        self.exitbutton = gtk.Button("EXIT")
        self.exitbutton.connect("clicked", self.destroy)
       
        #scrolled window box
        self.main_sw = gtk.ScrolledWindow()
 
        #Hauptbox
        self.mainbox = gtk.VBox()
        self.mainbox.pack_start(self.textbox, expand=False)
        self.mainbox.pack_start(self.loadbutton, expand=False)
        self.mainbox.pack_start(self.main_sw)
        self.mainbox.pack_start(self.exitbutton, expand=False)
 
        #Hauptfenster
        self.window.add(self.mainbox)
        self.window.show_all()
        self.window.connect("destroy", self.destroy)
 
    def main(self):
        gtk.main()
 
 
if __name__ == "__main__":
    base = Base()
    base.main()