2013-10-23 40 views
0

可能我在Python和GTK中都比新手少。在這裏我的問題: 我創建了一個類來顯示帶有搜索欄和樹視圖的窗口。 我填寫從SQLITEDB讀取的樹。Gtk Python回調

好。

我想使用的搜索欄,才能在樹視圖中選擇項目(這樣執行,一個數據庫搜索,並填寫與結果樹視圖)

,因爲我,我擋在了回調無法理解如何將用戶插入的數據傳遞給特定的功能。 從我的(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() 

任何幫助,非常感謝

+0

我不知道你想要什麼。請澄清您的問題,刪除與問題無關的代碼和評論,並創建最小化的測試用例。 – OdraEncoded

回答

0

確定你想要做什麼,但如果你想過濾的樹狀基於輸入的文字告訴你,你應該看看GtkTreeModelFilter不是100%。您可以將它用作TreeModel並設置您自己的VisibleFunc,根據輸入的文本決定是否應該顯示一行。當文本改變時,只需調用refilter():它將爲每行調用VisibleFunc()。

對不起,沒有python的例子或文檔給你,我希望仍然有幫助...

+1

要使用GtkTreeModelFilter,您必須首先獲取所有*行,這可能不是一個壞主意,具體取決於OP的工作方式。 – OdraEncoded