0

可能我在 python 和 GTK 中都不是新手。这是我的问题:我创建了一个类来显示带有搜索栏和树视图的窗口。我填充了从 SQLITEDB 读取的树。

美好的。

我想使用搜索栏来选择树视图中的项目(因此执行数据库搜索并用结果填充树视图)

我在回调中被阻止,因为我不明白如何将用户插入的数据传递给特定的函数。在我的(STUPID)代码的一些行下面。

class SecondWin:
    def __init__(self):
        self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.win.connect("delete_event", self.delete_event)
        self.win.set_title("Gmail Phonebook")
        self.win.set_size_request(600, 300) #Larghez1za, Altezza
        self.win.set_border_width(8)
        self.win.set_position(gtk.WIN_POS_CENTER)
        self.win.connect("destroy", self.destroy)

        self.table = gtk.Table(8, 8,True)

        self.cerca_bottone = gtk.Button("Cerca")
        self.cerca_bottone.set_size_request(70, 30) #Larghezza, Altezza
        self.cerca_bottone.connect( "clicked", self.cercainrubrica) #Call back sul bottone
        self.table.attach(self.cerca_bottone, 0, 1, 0, 1,gtk.SHRINK,gtk.SHRINK)

#       Search BAR
        self.hbox = gtk.HBox()
        self.entry = gtk.Entry(30) 
        self.entry.connect("activate", self.cercainrubrica) #call back su enter
        self.hbox.pack_end(self.entry)
        self.table.attach(self.hbox, 1, 8, 0, 1,gtk.EXPAND|gtk.FILL|gtk.SHRINK,
                      gtk.EXPAND|gtk.FILL|gtk.SHRINK,0,0)

        self.vbox = gtk.VBox(False, 8)
        self.sw = gtk.ScrolledWindow()
        self.sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.vbox.pack_start(self.sw, True, True, 0)
        self.table.attach(self.vbox, 1, 8, 1, 9,gtk.EXPAND|gtk.FILL|gtk.SHRINK,
                      gtk.EXPAND|gtk.FILL|gtk.SHRINK,10,10)  

        rubrica=mydb.find_record_complex("%", colonne_test[0]) 

        store = self.create_model(rubrica) #THIS WORK FINE DISPLAYING THE SELECTION

        HERE MY FUNCION

        self.cercainrubrica ??

        treeView=gtk.TreeView(store)
        treeView.connect("row-activated", self.on_activated)
        treeView.set_rules_hint(True)
        self.sw.add(treeView)
        self.create_columns(treeView,nomi_colonne)
        self.statusbar = gtk.Statusbar()



        self.win.add(self.table)
        self.win.show_all()

THIS IS MY CALL BACK
    def cercainrubrica( self, w, data=None):
        name = self.entry.get_text()
        capperi=mydb.find_record_complex(name, colonne_test[0]) 
        store = self.create_model(capperi)

        return store



    def delete_event(self, widget, event, data=None):
        return gtk.FALSE
    def destroy(self, widget, data=None):
        return gtk.main_quit()
    def main(self):
        gtk.main()
    def create_model(self,records):
        store = gtk.ListStore(str, str, str,str)

        for record in records:
            store.append([record[1], record[2], record[3],record[4]])

        return store

    def create_columns(self, treeView,intestazione_colonne):

        i = 0
        for nomecolonna in intestazione_colonne:
            rendererText = gtk.CellRendererText()
            column = gtk.TreeViewColumn(intestazione_colonne[i], rendererText, text=i)
            column.set_sort_column_id(i)    
            treeView.append_column(column)
            i += 1

    def on_activated(self, widget, row, col):

        model = widget.get_model()
        text = model[row][0] + ", " + model[row][1] + ", " + model[row][2]
        self.statusbar.push(0, text)    

if __name__ == "__main__":
    second = SecondWin()
    second.main()

非常感谢任何帮助

4

1 回答 1

0

不是 100% 确定你想做什么,但如果你想根据输入的文本过滤树视图显示的内容,你应该看看GtkTreeModelFilter。您可以将其用作 TreeModel 并设置您自己的 VisibleFunc,以根据输入的文本决定一行是否可见。当文本更改时,只需调用 refilter(): 将为每一行调用 VisibleFunc()。

很抱歉没有为您提供 python 示例或文档,我希望仍然有帮助......

于 2013-10-23T14:58:17.430 回答