2016-11-25 6 views
0

GTK/Python에서 노드가있는 인터페이스를 만들려고합니다.GTK 1 Liststore에 3 개의 다른 필터를 만드는 방법

photo of my interface

ChronoMap

내가 하나 liststore을 만들고 내가 다른 일을 필터링 할 수 있습니다. 사용자는 두 가지 작업을 수행해야합니다. 먼저 노드 유형, 노드의 시작 이름 등으로 필터링하려는 경우 사용할 필터 유형을 콤보 상자에서 선택해야합니다.

그런 다음 텍스트 항목에서 그는보고 싶은 정보를 결정합니다. 노드 유형의 예제를 가져옵니다. 3 가지 유형의 노드, 노드 유형 1, 노드 유형 2 및 노드 유형 3이 있습니다. 사용자로서 노드 유형 1 만보고 싶기 때문에 노드 항목에 1을 씁니다. 실제로 문제가 있습니다. 필터가 작동하지 않습니다.

처음 2 liststores을 만듭니다

내 3 개 가지 필터가 있습니다
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() 

: 내 콤보 박스를 변경하면

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

그리고 작동하지 않습니다.

+0

귀하의 질문은 우리가 무엇을하고 있는지 모르는 곳없는 많은 코드가 있기 때문에 지금 당장 대답하기가 어렵습니다. 예를 들어,'self.View' 유형이 무엇이고'current_filter' 속성이 무엇인지 모릅니다. 문제를 보여주는 짧은 예제를 만들 수 있습니까? 그게 당신이 직접 솔루션을 때리는 데 도움이 될 수도 있습니다 ... – ptomato

+0

고맙습니다. –

+1

마지막으로, 약간의 예제를 작성했기 때문에 문제를 파악할 수있었습니다. 3보다는 1 필터를 작성해야합니다. int 대신 int로 입력해야합니다. –

답변

1

마지막으로,

나는 스스로 해결할 수 있습니다.

세 개가 아닌 하나의 필터를 만들어야합니다. 같은 문제가있는 사람들에게 이것은 내 문제를 해결하는 데 도움이되는 아주 좋은 예입니다.

Picture of this program

import gi 
    gi.require_version('Gtk', '3.0') 
    from gi.repository import Gtk 

    #list of tuples for each software, containing the software name, initial release, and main programming languages used 
    software_list = [("Firefox", 2002, "C++"), 
      ("Eclipse", 2004, "Java"), 
      ("Pitivi", 2004, "Python"), 
      ("Netbeans", 1996, "Java"), 
      ("Chrome", 2008, "C++"), 
      ("Filezilla", 2001, "C++"), 
      ("Bazaar", 2005, "Python"), 
      ("Git", 2005, "C"), 
      ("Linux Kernel", 1991, "C"), 
      ("GCC", 1987, "C"), 
      ("Frostwire", 2004, "Java")] 

    class TreeViewFilterWindow(Gtk.Window): 

     def __init__(self): 
      Gtk.Window.__init__(self, title="Treeview Filter Demo") 
      self.set_border_width(10) 

    #Setting up the self.grid in which the elements are to be positionned 
      self.grid = Gtk.Grid() 
      self.grid.set_column_homogeneous(True) 
      self.grid.set_row_homogeneous(True) 
      self.add(self.grid) 

      #Creating the ListStore model 
      self.software_liststore = Gtk.ListStore(str, int, str) 
      for software_ref in software_list: 
       self.software_liststore.append(list(software_ref)) 
       self.current_filter_language = None 

    #Creating the filter, feeding it with the liststore model 
      self.language_filter = self.software_liststore.filter_new() 
    #setting the filter function, note that we're not using the 
      self.language_filter.set_visible_func(self.language_filter_func) 

    #creating the treeview, making it use the filter as a model, and adding the columns 
      self.treeview = Gtk.TreeView.new_with_model(self.language_filter) 
      for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]): 
       renderer = Gtk.CellRendererText() 
       column = Gtk.TreeViewColumn(column_title, renderer, text=i) 
       self.treeview.append_column(column) 

    #creating buttons to filter by programming language, and setting up their events 
      self.buttons = list() 
      for prog_language in ["Java", "C", "C++", "Python", "None"]: 
       button = Gtk.Button(prog_language) 
       self.buttons.append(button) 
       button.connect("clicked", self.on_selection_button_clicked) 

    #setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row 
      self.scrollable_treelist = Gtk.ScrolledWindow() 
      self.scrollable_treelist.set_vexpand(True) 
      self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10) 
      self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1) 
      for i, button in enumerate(self.buttons[1:]): 
       self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1) 
      self.scrollable_treelist.add(self.treeview) 

      self.show_all() 

     def language_filter_func(self, model, iter, data): 
    """Tests if the language in the row is the one in the filter""" 
      if self.current_filter_language is None or self.current_filter_language == "None": 
       return True 
      else: 
       return model[iter][2] == self.current_filter_language 

     def on_selection_button_clicked(self, widget): 
    """Called on any of the button clicks""" 
    #we set the current language filter to the button's label 
      self.current_filter_language = widget.get_label() 
      print("%s language selected!" % self.current_filter_language) 
    #we update the filter, which updates in turn the view 
      self.language_filter.refilter() 


    win = TreeViewFilterWindow() 
    win.connect("delete-event", Gtk.main_quit) 
    win.show_all() 
    Gtk.main()