comp_tree.py


directory : D:\2018_py_proj\TkGridGUI\tkgridgui
Line Count : 117
Line Clip Size : No Clipping

tab_of_notebook_changed  Word MatchCase (0) 
1 #!/usr/bin/env python 2 # -*- coding: ascii -*- 3 from __future__ import print_function 4 from __future__ import unicode_literals 5 6 from builtins import str 7 from builtins import object 8 """Generates a list of Component objects in order of tab_label dependence.""" 9 10 class CNode( object ): 11 12 def __init__(self, comp_name, tab_label, component): 13 14 self.comp_name = comp_name 15 self.tab_label = tab_label 16 self.component = component 17 18 def __str__(self): 19 return '<%s, %s>'%(self.comp_name, self.tab_label) 20 21 class ComponentTree(object): 22 """Creates a Tree of interdependent Component objects""" 23 def __init__(self): 24 25 self.containerD = {'Main':[]} # index=container_name: value=list of CNode components in container 26 self.compD = {} # index=comp_name: value=CNode 27 28 29 def add_node(self, node): 30 31 # if container is not in containerD, put it in 32 if node.tab_label not in self.containerD: 33 self.containerD[ node.tab_label ] = [] 34 35 self.containerD[ node.tab_label ].append( node ) 36 self.compD[ node.comp_name ] = node 37 38 def get_ordered_components(self): 39 """Generates a list of Component objects in order of tab_label dependence.""" 40 def get_next( tab_label, resultL ): 41 if tab_label is None: 42 tab_label = "Main" 43 44 compL = sorted( self.containerD[tab_label], key=lambda c: c.comp_name ) 45 #print( tab_label, [str(c) for c in compL] ) 46 #print() 47 resultL.extend( compL ) 48 49 nextL = [] 50 for c in compL: 51 if c.comp_name in self.containerD: 52 nextL.append( c ) 53 54 for c in nextL: 55 get_next(c.comp_name, resultL) 56 57 ansL = [] 58 get_next( None, ansL ) 59 #print('Sorted Comp:', [c.comp_name for c in ansL] ) 60 61 # need to resort Tab objects for order added to Notebook 62 final_ansL = [] 63 tabL = [] 64 for cn in ansL: 65 66 if cn.comp_name.startswith('Tab'): 67 c = cn.component 68 tabL.append( (c.row, c.col, c.widget_name, c.user_tkOptionD['text'], cn) ) 69 tabL = sorted( tabL ) 70 else: 71 if tabL: 72 for _,_,widget_name,_,cn_tab in tabL: 73 final_ansL.append( cn_tab ) 74 tabL = [] 75 76 final_ansL.append( cn ) 77 # maybe clean up strggler Tab objects 78 if tabL: 79 for _,_,widget_name,_,cn_tab in tabL: 80 final_ansL.append( cn_tab ) 81 #print('Final Sorted Comp:', [c.comp_name for c in final_ansL] ) 82 83 return final_ansL 84 85 86 if __name__ == "__main__": 87 88 ct = ComponentTree() 89 ct.add_node( CNode('Frame_3', 'Main', 'Frame_3_Component') ) 90 91 ct.add_node( CNode('Button_4', 'Main', 'Button_4_Component') ) 92 93 ct.add_node( CNode('Button_2', 'Main', 'Button_2_Component') ) 94 ct.add_node( CNode('Button_3', 'Frame_1', 'Button_3_Component') ) 95 96 ct.add_node( CNode('Button_1', 'Main', 'Button_1_Component') ) 97 98 ct.add_node( CNode('Frame_1', 'Main', 'Frame_1_Component') ) 99 ct.add_node( CNode('Frame_2', 'Main', 'Frame_2_Component') ) 100 101 ct.add_node( CNode('Button_5', 'Frame_3', 'Button_5_Component') ) 102 103 print('ct.containerD.keys() =',list(ct.containerD.keys())) 104 print('-'*55) 105 106 for key,valL in list(ct.containerD.items()): 107 print(key, [str(val) for val in valL]) 108 print('-'*55) 109 110 compL = ct.get_ordered_components() 111 for c in compL: 112 print( c ) 113 114 115 116 117