Filter nach Text mit ViewTree

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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...
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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()
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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()
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@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])
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

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()
Antworten