0
在GTK/Python中,我試圖構建一個帶節點的接口。GTK如何爲1創建3個不同的過濾器Liststore
我創建一個liststore,我想篩選不同的東西。用戶必須執行兩個操作,首先,他必須在組合框中選擇他想要使用的過濾器類型,如果他想按節點類型,節點的開始名稱或其他名稱進行過濾。
然後在文本輸入中,他決定他想看到什麼信息。以節點類型爲例。有三種不同類型的節點,節點類型1,節點類型2和節點類型3.作爲用戶我只想看到節點類型1,所以我在節點條目中寫入1。其實我有一個問題,這是我的過濾器不起作用。
我首先創建2個liststores:
def create_liststore(self):
if len(self.FdessinCarto.pos) != 0:
for i,node in enumerate(self.FdessinCarto.pos):
self.node_liststore.append([str(node.title),self.controller.model.string_from_numdate(int(node.start_time)),self.controller.model.string_from_numdate(int(node.end_time)),str(node.node_group),str(node.description),str(node.attachment_list)])
self.edgelist = self.controller.get_edge_list()
if len(self.edgelist) !=0:
for i in self.edgelist:
edge_prop=self.controller.edge_data(i[0],i[1])
self.edge_liststore.append([edge_prop['label'],str(i[0].title),str(i[1].title),edge_prop['description'],edge_prop['attachment_list']])
#creating the treeview for Node, making it use the filter as a model, and adding the columns
self.treeviewNode = Gtk.TreeView.new_with_model(self.node_liststore)
for i, column_title in enumerate(["Name", "Beginning date", "End date", "Type of node", "Description of node","files"]):
self.Noderenderer = Gtk.CellRendererText()
self.Noderenderer.set_property("editable", True)
column = Gtk.TreeViewColumn(column_title, self.Noderenderer, text=i)
column.set_sort_column_id(0)
self.treeviewNode.append_column(column)
#creating the treeview for edge
self.treeviewEdge = Gtk.TreeView.new_with_model(self.edge_liststore)
for i, column_title in enumerate(["Name", "Node 1", "Node 2", "Description of edge","file"]):
self.Edgerenderer = Gtk.CellRendererText()
self.Edgerenderer.set_property("editable", True)
column = Gtk.TreeViewColumn(column_title, self.Edgerenderer, text=i)
column.set_sort_column_id(0)
self.treeviewEdge.append_column(column)
self.SWViewListStore.add(self.treeviewNode)
self.SWEdgeStore.add(self.treeviewEdge)
self.SWViewListStore.show_all()
self.SWEdgeStore.show_all()
有我的3個不同的過濾器:
#creating the filtre
self.node_beginning_date_filter = self.node_liststore.filter_new()
self.node_end_date_filter = self.node_liststore.filter_new()
self.node_type_filter = self.node_liststore.filter_new()
#setting the filter function, note that we're not using the
self.node_end_date_filter.set_visible_func(self.node_end_date_filter_func)
self.node_beginning_date_filter.set_visible_func(self.node_beginning_date_filter_func)
self.node_type_filter.set_visible_func(self.node_type_filter_func)
有一次,我改變我的組合框,它會激活我的功能,它採取的類型combofilter隨後還組合框的文本:
def on_entryComboBox_changed(self,widget):
textComboFilter = self.View.combo_filter.get_active_text()
print("textComboFilter %s" %textComboFilter)
if textComboFilter == "Filter by node's beginning date":
#print("%s language selected!" % textComboFilter)
self.View.current_filter = textComboFilter
self.View.node_beginning_date_filter.refilter()
if textComboFilter == "Filter by node's end date":
#print("%s language selected!" % textComboFilter)
self.View.current_filter = textComboFilter
self.View.node_end_date_filter.refilter()
if textComboFilter == "Filter by type of node":
#print("%s language selected!" % textComboFilter)
self.View.current_filter = textComboFilter
self.View.node_type_filter.refilter()
而且這是行不通的。
你的問題很難馬上給出答案,因爲有缺失,我們不知道它是做了很多的代碼。例如,我不確定'self.View'是什麼類型,它的'current_filter'屬性是什麼。你能否做出一個簡短的,獨立的例子來說明問題?這甚至可以幫助你自己解決方案... – ptomato
謝謝你,我會做到這一點。 –
最後,由於我創建了一個小例子,我設法弄清楚了這個問題。我應該創建1個過濾器而不是3個。然後我應該使用字符串作爲輸入而不是int。 –