2017-06-09 3 views
0

私はPyGtkを使用してダブルリストからツリーストアを作成しようとしています。これが私のやり方です。PyGtk:ダブルリストからツリーストアを作成する

class PyApp(gtk.Window): 
    def __init__(self): 
     super(PyApp, self).__init__() 

     self.set_size_request(400, 300) 
     self.set_position(gtk.WIN_POS_CENTER) 

     self.connect("destroy", gtk.main_quit) 
     self.set_title("Tree") 

     tree = gtk.TreeView() 

     languages = gtk.TreeViewColumn() 
     languages.set_title("Files") 

     cell = gtk.CellRendererText() 
     languages.pack_start(cell, True) 
     languages.add_attribute(cell, "text", 0) 

     treestore = gtk.TreeStore(str) 

     doubleL = [['123', 'user1', 'Thisone' 'its.zip'], 
     ['Kafueta', 'user1', 'zippedtto.zip'], 
     ['Mohm', 'user1', 'zippedtto.zip'], 
     ['Hom', 'user2', 'Iam.zip'], 
     ['abcd', 'test', 'Letsee.zip']] 

     for lis in doubleL: 
      par = treestore.append(None, [lis[0]]) 
      two = treestore.append(par, [lis[1]]) 
      treestore.append(two, [lis[2]]) 

     tree.append_column(languages) 
     tree.set_model(treestore) 

     self.add(tree) 
     self.show_all() 

これは、以下のようにGUIに表示できるトレストアを生成します。しかし、あなたが見ることができるように、私はそれに多くの要素を持つリストを持っている場合、これはあまり効果的ではありません。 forループ これは非常に長くなることができます。

for lis in doubleL: 
    par = treestore.append(None, [lis[0]]) 
    two = treestore.append(par, [lis[1]]) 
    treestore.append(two, [lis[2]] 

は、私はツリーを作成するために、ループのために上記で使用することができ、より効果的な方法はありますか? enter image description here

+0

加えることは本当に正しいのですが、あなたはおそらく別のポストからのトリックを適用することによって、それがより効率的に行うことができます。https://stackoverflow.com/questions/3547743/gtktreeview-insert-update-performance-penalty- sort-of-sortingオリジナルの投稿を見て、その答えの1つが別のトリックを提供します。 – jcoppens

答えて

0

これはreduce()にぴったりのケースのようになります。

reduce(lambda x, y: treestore.append(x, [lis[y]]), range(len(lis)), None) 

では削減、上記のラムダでxは、本質的にそれは同等のあなたのケースでは、以下になって、以前にネストされています。

treestore.append(treestore.append(treestore.append(None, [lis[0]]), [lis[1]]), [lis[2]])