Welcome, guest | Sign In | My Account | Store | Cart
# Version 0.1
# Author: Miguel Martinez Lopez
# Uncomment the next line to see my email
# print "Email: ", "61706c69636163696f6e616d656469646140676d61696c2e636f6d".decode("hex")


from Tkinter import *
from collections import defaultdict
import itertools


class connected_Panedgrids(object):

       
def __init__(self, numRows=0, numColumns=0):
               
if type(numRows) is not int:
                       
raise Exception("The number of shared rows is not an int.")

               
if type(numColumns) is not int:
                       
raise Exception("The number of shared columns is not an int.")

               
self.numberOfSharedRows = numRows
               
self.numberOfSharedColumns = numColumns

               
self.panedwindow_conexion = SimultaneousPanels()

               
self.__connected_widgets = {}

       
def create_widget(self, master, shared_rows=[], shared_columns=[], shared_panedwindows=[], **kwargs):
                panedgrid_widget
= PanedGrid(master, **kwargs)

               
self.add_widget(panedgrid_widget, shared_rows, shared_columns, shared_panedwindows)
               
return panedgrid_widget

       
def add_widget(self, panedgrid_widget, shared_rows=[], shared_columns=[], shared_panedwindows=[]):

               
if shared_rows == 'all':
                        shared_rows
= range(self.numberOfSharedRows)

               
if shared_columns == 'all':
                        shared_columns
= range(self.numberOfSharedColumns)

                widget_bundle
= {       'panedgrid_widget': panedgrid_widget,
                                                       
'shared_rows' : shared_rows,
                                                       
'shared_columns': shared_columns,
                                                       
'shared_panedwindows': shared_panedwindows
                                               
}

               
self.__connected_widgets[str(panedgrid_widget)] = widget_bundle

       
def delete_widget(self, widget_reference):
               
del self.__connected_widgets[str(panedgrid_widget)]

       
def update(self):
               
self.panedwindow_conexion.clear()

                height_list
= [0]*self.numberOfSharedRows
                width_list
= [0]*self.numberOfSharedColumns

               
for bundle_INFO in self.__connected_widgets.values():
                        panedgrid_widget
= bundle_INFO['panedgrid_widget']
                        shared_panedwindows
= bundle_INFO['shared_panedwindows']
                        shared_rows
= bundle_INFO['shared_rows']
                        shared_columns
= bundle_INFO['shared_columns']

                       
if not panedgrid_widget.builded:
                                panedgrid_widget
.build()


                       
if shared_panedwindows == 'all':
                                shared_panedwindows
= range(len(panedgrid_widget.panedwindows))

                       
for conexion_index, panedwindow_index in enumerate(shared_panedwindows):
                                internal_panedwindow
= panedgrid_widget.panedwindows[panedwindow_index]
                               
self.panedwindow_conexion.add_widget(internal_panedwindow, tag=conexion_index)

                                pane_indices
= range(*internal_panedwindow.index_range)

                               
if panedgrid_widget.orient == HORIZONTAL:
                                        shared_columns
.extend(pane_indices)
                               
else:
                                        shared_rows
.extend(pane_indices)


                        shared_rows
= sorted(set(shared_rows))
                        shared_columns
= sorted(set(shared_columns))

                       
if self.numberOfSharedRows != len(shared_rows):
                               
raise Exception("The number of shared rows %s is not equal to %s." % (len(shared_rows), self.numberOfSharedRows) )
                       
if self.numberOfSharedColumns != len(shared_columns):
                               
raise Exception("The number of shared columns %s is not equal to %s." % (len(shared_columns), self.numberOfSharedColumns) )

                        bundle_INFO
['shared_rows'] = shared_rows
                        bundle_INFO
['shared_columns'] = shared_columns

                       
for position_in_height_list, row_index in enumerate(shared_rows):
                                height_list
[position_in_height_list] = max(
                                                                                                height_list
[position_in_height_list],
                                                                                                panedgrid_widget
.get_row_height( row_index )
                                                                                               
)


                       
for position_in_width_list, column_index in enumerate(shared_columns):
                                width_list
[position_in_width_list] = max(
                                                                                                width_list
[position_in_width_list],
                                                                                                panedgrid_widget
.get_column_width( column_index )
                                                                                               
)

               
for bundle_INFO in self.__connected_widgets.values():

                       
for positionInList, rowIndex in enumerate(bundle_INFO['shared_rows']):
                                bundle_INFO
['panedgrid_widget'].rowconfigure(rowIndex, height = height_list[positionInList])

                       
for positionInList, columnIndex in enumerate(bundle_INFO['shared_columns']):
                                bundle_INFO
['panedgrid_widget'].columnconfigure(columnIndex, width = width_list[positionInList])



class SimultaneousPanels(PanedWindow):

       
def __init__(self):
               
self.collectionOfPanedWindows = {}

       
def create_widget(self,master, tag= '_default', **kargs):
                widget
= PanedWindow(master, **kargs)
               
self.add_widget(widget,tag)

               
return widget

       
def add_widget(self, widget, tag):
                widget
.other_paned_windows = []

               
if tag in self.collectionOfPanedWindows:
                       
for pwindow in self.collectionOfPanedWindows[tag]:
                                widget
.other_paned_windows.append(pwindow)
                                pwindow
.other_paned_windows.append(widget)

                       
self.collectionOfPanedWindows[tag].append(widget)
               
else:
                       
self.collectionOfPanedWindows[tag] = [widget]

                widget
.bindtags( ('SimultaneousPanels',)+ widget.bindtags() )
                widget
.bind_class('SimultaneousPanels', '<Button-1>', self.sash_mark)
                widget
.bind_class('SimultaneousPanels', '<B1-Motion>', self.sash_dragto)

       
def sash_mark(self,event):
                this_widget
= event.widget

                identity
= this_widget.identify(event.x, event.y)

               
if len(identity) ==2:
                        index
= identity[0]
                        this_widget
.activedSash=index
               
else:
                        this_widget
.activedSash = None

       
def sash_dragto(self,event):
                this_widget
= event.widget
                activedSash
= this_widget.activedSash

               
if activedSash != None:
                       
for pwindow in this_widget.other_paned_windows:
                                pwindow
.sash_place(activedSash, event.x, event.y)

       
def clear(self):
               
for list_of_panels in self.collectionOfPanedWindows.values():
                       
for panel in list_of_panels:
                               
del panel.other_paned_windows
                               
self.delete_bindtag(panel)
               
self.collectionOfPanedWindows = {}

       
def delete_tag(self, tag):
               
for widget in self.collectionOfPanedWindows[tag]:
                       
del widget.other_paned_windows
                       
self.delete_bindtag(widget)

               
del self.collectionOfPanedWindows[tag]

       
def delete_widget(self, widget, tag):
               
for panel in self.collectionOfPanedWindows[tag]:
                        panel
.other_paned_windows.remove(widget)
               
self.delete_bindtag(widget)
               
del widget.other_paned_windows

       
def delete_bindtag(self, widget):
                new_bindtags
= list(widget.bindtags())
                new_bindtags
.remove('SimultaneousPanels')
                widget
.bindtags(tuple(new_bindtags))

               
class PanedGrid(Frame):
       
def __init__(self, master, orient=HORIZONTAL, minsize=20, columnWidths = {}, rowHeights={}, fixedPanes = []):
               
Frame.__init__(self,master)

               
if orient in (HORIZONTAL, VERTICAL):
                       
self.orient = orient
               
else:
                       
raise Exception("orient must be 'horizontal' or 'vertical, not '%s'." % orient)

               
if type(minsize) is int:
                       
self.minsize = minsize
               
else:
                       
raise Exception("Minsize must be an integer.")

               
self.fixedPanes = set(fixedPanes)

               
self.__packSideBetweenPanes = LEFT if self.orient == HORIZONTAL else TOP
               
self.__packSideInsidePane = TOP if self.orient == HORIZONTAL else LEFT
               
self.__cellFill = X if self.orient == HORIZONTAL else Y

               
self.userDefinedWidths = columnWidths
               
self.userDefinedHeights = rowHeights

               
self.__panes = {}

               
self.builded = False

               
self.clear_table()


       
def clear_table(self):
               
if not self.builded:
                       
self.__gridOfWidgets = {}

                       
self.__rows = defaultdict(set)
                       
self.__columns = defaultdict(set)

                       
self.__rowHeights = {}
                       
self.__columnWidths = {}

                       
self.userDefinedWidths = {}
                       
self.userDefinedHeights = {}

               
else:
                       
raise Exception("You can't clear the table one this is builded.")

       
def rowIndices(self):
               
return self.__rows.keys()

       
def columnIndices(self):
               
return self.__columns.keys()

       
def numberOfRows(self):
               
return len(self.__rows)

       
def numberOfColumns(self):
               
return len(self.__columns)

       
def update_cell(self, coordinates, widget):
               
if not self.builded:
                       
raise Exception("First you must to build the panedgrid.")

               
if coordinates in self.__gridOfWidgets:
                        master
= self.__gridOfWidgets[coordinates].pack_info()['in']
                       
self.__gridOfWidgets[coordinates].destroy()
                       
self.__gridOfWidgets[coordinates] = widget
                        widget
.pack(in_=master, expand=YES, fill=BOTH)
               
else:
                       
raise Exception("There is no widget with coordiantes: %s." % coordinates)


       
def build(self):
               
if self.builded:
                       
raise Exception("You have just builded the grid before.")

               
if not self.__gridOfWidgets: return

               
if self.calculate_dimensions:
                       
self.__calculate_list_of_cell_widths_and_heights()

               
self.panedwindows = []

                listOfCellCoordinates
= list(itertools.product(self.__rows, self.__columns))

               
if self.orient == HORIZONTAL:
                        listOfCellCoordinates
.sort(key = lambda item: (item[1], item[0]))
               
else:
                        listOfCellCoordinates
.sort()

               
# We set up the first pane index
                pane_index
= self.__columns[0] if self.orient == HORIZONTAL else self.__rows[0]

                position_of_main_index
= 1 if self.orient == HORIZONTAL else 0

                newPanedWindow
= True

               
for cell_coordinates in listOfCellCoordinates:

                        main_index
= cell_coordinates[position_of_main_index]
                       
if pane_index != main_index:
                               
# Creating a new pane
                                pane_index
= main_index

                               
if pane_index in self.fixedPanes:
                                        frameOfPane
= Frame(self)
                                        frameOfPane
.pack(side=self.__packSideBetweenPanes)
                                        newPanedWindow
= True
                               
else:
                                       
if newPanedWindow:
                                                paneMaster
= PanedWindow(self,orient=self.orient, bd=0, sashwidth=3)
                                                paneMaster
.index_range = (pane_index, pane_index + 1 )

                                                paneMaster
.pack(side=self.__packSideBetweenPanes)

                                               
self.panedwindows.append(paneMaster)
                                                newPanedWindow
= False
                                       
else:
                                                beginning_of_range
= paneMaster.index_range[0]
                                                ending_of_range
= pane_index + 1
                                                paneMaster
.index_range = (beginning_of_range, ending_of_range)

                                        frameOfPane
= Frame(paneMaster)
                                        frameOfPane
.pack()
                                        paneMaster
.add(frameOfPane)

                                        paneMaster
.paneconfigure(frameOfPane, minsize=self.minsize)

                                sizeOfPane
= self.__columnWidths[pane_index] if self.orient == HORIZONTAL else self.__rowHeights[pane_index]

                               
if self.orient == HORIZONTAL:
                                        frameOfPane
.configure(width=sizeOfPane, height=self.tableHeight)
                               
else:
                                        frameOfPane
.configure(width=self.tableWidth, height=sizeOfPane)

                                frameOfPane
.pack_propagate(False)

                               
self.__panes[pane_index] = frameOfPane

                        cellFrame
= Frame(frameOfPane, bd=1, relief=SUNKEN)
                        cellFrame
.pack(side=self.__packSideInsidePane, expand=YES, fill=self.__cellFill)
                        cellFrame
.pack_propagate(False)

                        widget
= self.__gridOfWidgets[cell_coordinates]

                       
if widget:
                                widget
.lift()
                                widget
.pack(in_=cellFrame, expand=YES, fill=BOTH)

                               
if self.orient == HORIZONTAL:
                                        cellFrame
.configure( height=self.__rowHeights[ cell_coordinates[0] ] )
                               
else:
                                        cellFrame
.configure( width=self.__columnWidths[ cell_coordinates[1] ] )

               
self.builded = True

       
def __calculate_list_of_cell_widths_and_heights(self):
               
self.__rowHeights = self.userDefinedHeights.copy()
               
self.__columnWidths = self.userDefinedWidths.copy()

               
for coordinate, widget in self.__gridOfWidgets.items():
                        i
, j = coordinate
                       
if i not in self.userDefinedHeights:
                               
self.__rowHeights[i] = max(self.__rowHeights.get(i,0),widget.winfo_reqheight())

                       
if j not in self.userDefinedWidths:
                               
self.__columnWidths[j] = max(self.__columnWidths.get(j,0),widget.winfo_reqwidth())

               
self.calculate_dimensions = False

       
@property
       
def tableHeight(self):
               
return sum(self.__rowHeights.values())

       
@property
       
def tableWidth(self):
               
return sum(self.__columnWidths.values())


       
def rowconfigure(self,row, height=None, fixed = None):
               
if row not in self.__rows:
                       
raise Exception("Row %d doesn't exists." % column)

               
if height is not None:

                       
if type(height) is not int: raise Exception("The height must be an integer:%s"%height)

                       
self.userDefinedHeights[row] = height

                       
if self.orient == VERTICAL:
                               
self.__panes[row].configure(height=height)
                       
else:
                               
for column in self.__rows[row]:
                                        cellFrame
= self.__gridOfWidgets[row,column].pack_info()['in']
                                        cellFrame
.configure(height=height)

               
if fixed is not None:
                       
if self.orient == HORIZONTAL:
                               
raise Exception("You can't set fixed property on a row because 'orient' is VERTICAL.")

                       
self.fix_pane(index, fixed)

       
def columnconfigure(self,column, width=None, fixed = None):
               
if column not in self.__columns:
                       
raise Exception("Column %d doesn't exists." % column)

               
if width is not None:
                       
if type(width) is not int: raise Exception("The width must be an integer:%s"%width)

                       
self.userDefinedWidths[column] = width

                       
if self.orient == HORIZONTAL:
                               
self.__panes[column].configure(width=width)
                       
else:
                               
for row in self.__columns[column]:
                                        cellFrame
= self.__gridOfWidgets[row,column].pack_info()['in']
                                        cellFrame
.configure(width=width)

               
if fixed is not None:
                       
if self.orient == VERTICAL:
                               
raise Exception("You can't set fixed property on a column because 'orient' is HORIZONTAL.")

                       
self.fix_pane(index, fixed)

       
def fix_pane(index, fixed=True):
               
if self.builded:
                       
raise Exception("You can't modify the fixed of the panes once you builded the grid.")

               
if fixed == True:
                       
self.fixedPanes.add(index)
               
elif fixed == False:
                       
self.fixedPanes.discard(index)
               
else:
                       
raise Exception("fixed must be 'True' or 'False'.")

       
def fix_all_panes(self):
               
if self.builded:
                       
raise Exception("You can't modify the fixed of the panes once you builded the grid.")

                fixedPanes_list
= self.__columns.keys() if self.orient == HORIZONTAL else self.__rows.keys()
               
self.fixedPanes = set(fixedPanes_list)

       
def realease_all_panes(self):
               
if self.builded:
                       
raise Exception("You can't modify the fixed of the panes once you builded the grid.")

               
self.fixedPanes = set()

       
def is_a_fixed_pane(self, index ):
                paneWidget
= self.__panes[index]

                parent
= self.nametowidget( paneWidgetid.winfo_parent() )

               
if parent.__class__.name == 'PanedWindow':
                       
return True
               
else:
                       
return False

       
def get_row_height(self, row):
               
if self.calculate_dimensions:
                       
self.__calculate_list_of_cell_widths_and_heights()

               
if self.orient == HORIZONTAL:
                       
if self.builded:
                               
return self.__panes[row].winfo_height()
                       
else:
                               
return self.__rowHeights[row]
               
else:
                       
return self.__rowHeights[row]

       
def get_column_width(self, column):
               
if self.calculate_dimensions:
                       
self.__calculate_list_of_cell_widths_and_heights()

               
if self.orient == HORIZONTAL:
                       
return self.__columnWidths[column]
               
else:
                       
if self.builded:
                               
return self.__panes[column].winfo_width()
                       
else:
                               
return self.__columnWidths[column]

       
def check_coordinates(self, coordinates):
               
if type(coordinates) is int:
                        i
= 0
                        j
= coordinates
               
else:
                       
try:
                                i
, j = coordinates
                               
if type(i) is not int or type(j) is not int:
                                       
raise Exception("Invalid coordinate")
                       
except:
                               
raise Exception("Invalid coordinate")

               
return (i,j)

       
def __getitem__(self, coordinates):
                coordinates
= self.check_coordinates(coordinates)

               
return self.__gridOfWidgets.get(coordinates)


       
def __setitem__(self,coordinates, widget):
               
if self.builded:
                       
raise Exception("The panedgrid was builded. Use cell_update() instead.")

                i
, j = self.check_coordinates(coordinates)

               
self.__gridOfWidgets[i,j] = widget

               
self.__rows[i].add(j)
               
self.__columns[j].add(i)

               
self.calculate_dimensions = True

       
def __delitem__(self, coordinates ):
               
if self.builded:
                       
raise Exception("The panedgrid was builded. Use cell_update() instead.")

                i
, j = self.check_coordinates(coordinates)

               
del self.__gridOfWidgets[i,j]

               
self.__rows[i].discard(j)
               
if not self.__rows[i]: del self.__rows[i]

               
self.__columns[j].discard(i)
               
if not self.__columns[j]: del self.__columns[j]

               
self.calculate_dimensions = True

       
def grid(self, *args, **kargs):
               
if not self.builded: self.build()
               
Frame.grid(self,*args, **kargs)

       
def pack(self, *args, **kargs):
               
if not self.builded: self.build()
               
Frame.pack(self,*args, **kargs)


                               
                               
def test():
       
import random

        root
= Tk()

       
def table_of_random_widgets(master, numRows,numColumns, **kwargs):
               
import ttk

                demo
= testConnection.create_widget(master, shared_columns ='all', shared_panedwindows='all', **kwargs)

                tkinterWidgets
=  (
                                       
(Label, {'text':'This is a label'}),
                                       
(Label, {'text':'This is another label', 'bg':'yellow'}),
                                       
(Checkbutton,{}),
                                       
(Button, {'text':'Click me'}),
                                       
(ttk.Combobox, {'values':('item1', 'item2','item3','item4')})
                                       
)

               
for i in range(numRows):
                       
for j in range(numColumns):
                                widgetClass
, args = random.choice(tkinterWidgets)
                                widget
= widgetClass(demo,**args)

                                demo
[i,j] =  widget

               
return demo
        testConnection
= connected_Panedgrids(0,6)

        table1
= table_of_random_widgets(root, numRows=4,numColumns=6, fixedPanes=[2,5])
        table2
= table_of_random_widgets(root, numRows=4,numColumns=6, fixedPanes=[2,5])

        testConnection
.update()

       
Label(root, text= "Two different paned grids connected. Columns 2 and 5 are fixed.").pack(anchor=NW,pady=7, padx=12)
        table1
.pack(anchor=NW,pady=2, padx=12)

        emptySpace
= Frame(root, height =50)
        emptySpace
.pack()

        table2
.pack(anchor=NW,pady=2, padx=12)

        emptySpace
= Frame(root, height =20)
        emptySpace
.pack()


        root
.mainloop()


if __name__ == '__main__':
        test
()

Diff to Previous Revision

--- revision 1 2014-06-18 13:56:12
+++ revision 2 2014-06-18 13:57:48
@@ -7,6 +7,113 @@
 
from Tkinter import *
 
from collections import defaultdict
 
import itertools
+
+
+class connected_Panedgrids(object):
+
+       def __init__(self, numRows=0, numColumns=0):
+               if type(numRows) is not int:
+                       raise Exception("The number of shared rows is not an int.")
+
+               if type(numColumns) is not int:
+                       raise Exception("The number of shared columns is not an int.")
+
+               self.numberOfSharedRows = numRows
+               self.numberOfSharedColumns = numColumns
+
+               self.panedwindow_conexion = SimultaneousPanels()
+
+               self.__connected_widgets = {}
+
+       def create_widget(self, master, shared_rows=[], shared_columns=[], shared_panedwindows=[], **kwargs):
+               panedgrid_widget = PanedGrid(master, **kwargs)
+
+               self.add_widget(panedgrid_widget, shared_rows, shared_columns, shared_panedwindows)
+               return panedgrid_widget
+
+       def add_widget(self, panedgrid_widget, shared_rows=[], shared_columns=[], shared_panedwindows=[]):
+
+               if shared_rows == 'all':
+                       shared_rows = range(self.numberOfSharedRows)
+
+               if shared_columns == 'all':
+                       shared_columns = range(self.numberOfSharedColumns)
+
+               widget_bundle = {       'panedgrid_widget': panedgrid_widget,
+                                                       'shared_rows' : shared_rows,
+                                                       'shared_columns': shared_columns,
+                                                       'shared_panedwindows': shared_panedwindows
+                                               }
+
+               self.__connected_widgets[str(panedgrid_widget)] = widget_bundle
+
+       def delete_widget(self, widget_reference):
+               del self.__connected_widgets[str(panedgrid_widget)]
+
+       def update(self):
+               self.panedwindow_conexion.clear()
+
+               height_list = [0]*self.numberOfSharedRows
+               width_list = [0]*self.numberOfSharedColumns
+
+               for bundle_INFO in self.__connected_widgets.values():
+                       panedgrid_widget = bundle_INFO['panedgrid_widget']
+                       shared_panedwindows = bundle_INFO['shared_panedwindows']
+                       shared_rows = bundle_INFO['shared_rows']
+                       shared_columns = bundle_INFO['shared_columns']
+
+                       if not panedgrid_widget.builded:
+                               panedgrid_widget.build()
+
+
+                       if shared_panedwindows == 'all':
+                               shared_panedwindows = range(len(panedgrid_widget.panedwindows))
+
+                       for conexion_index, panedwindow_index in enumerate(shared_panedwindows):
+                               internal_panedwindow = panedgrid_widget.panedwindows[panedwindow_index]
+                               self.panedwindow_conexion.add_widget(internal_panedwindow, tag=conexion_index)
+
+                               pane_indices = range(*internal_panedwindow.index_range)
+
+                               if panedgrid_widget.orient == HORIZONTAL:
+                                       shared_columns.extend(pane_indices)
+                               else:
+                                       shared_rows.extend(pane_indices)
+
+
+                       shared_rows = sorted(set(shared_rows))
+                       shared_columns = sorted(set(shared_columns))
+
+                       if self.numberOfSharedRows != len(shared_rows):
+                               raise Exception("The number of shared rows %s is not equal to %s." % (len(shared_rows), self.numberOfSharedRows) )
+                       if self.numberOfSharedColumns != len(shared_columns):
+                               raise Exception("The number of shared columns %s is not equal to %s." % (len(shared_columns), self.numberOfSharedColumns) )
+
+                       bundle_INFO['shared_rows'] = shared_rows
+                       bundle_INFO['shared_columns'] = shared_columns
+
+                       for position_in_height_list, row_index in enumerate(shared_rows):
+                               height_list[position_in_height_list] = max(
+                                                                                               height_list[position_in_height_list],
+                                                                                               panedgrid_widget.get_row_height( row_index )
+                                                                                               )
+
+
+                       for position_in_width_list, column_index in enumerate(shared_columns):
+                               width_list[position_in_width_list] = max(
+                                                                                               width_list[position_in_width_list],
+                                                                                               panedgrid_widget.get_column_width( column_index )
+                                                                                               )
+
+               for bundle_INFO in self.__connected_widgets.values():
+
+                       for positionInList, rowIndex in enumerate(bundle_INFO['shared_rows']):
+                               bundle_INFO['panedgrid_widget'].rowconfigure(rowIndex, height = height_list[positionInList])
+
+                       for positionInList, columnIndex in enumerate(bundle_INFO['shared_columns']):
+                               bundle_INFO['panedgrid_widget'].columnconfigure(columnIndex, width = width_list[positionInList])
+
+
 
 
class SimultaneousPanels(PanedWindow):
 
@@ -80,110 +187,6 @@
                widget
.bindtags(tuple(new_bindtags))
 
               
-class connected_Panedgrids(object):
-
-       def __init__(self, numRows=0, numColumns=0):
-               if type(numRows) is not int:
-                       raise Exception("The number of shared rows is not an int.")
-
-               if type(numColumns) is not int:
-                       raise Exception("The number of shared columns is not an int.")
-
-               self.numberOfSharedRows = numRows
-               self.numberOfSharedColumns = numColumns
-
-               self.panedwindow_conexion = SimultaneousPanels()
-
-               self.__connected_widgets = {}
-
-       def create_widget(self, master, shared_rows=[], shared_columns=[], shared_panedwindows=[], **kwargs):
-               panedgrid_widget = PanedGrid(master, **kwargs)
-
-               self.add_widget(panedgrid_widget, shared_rows, shared_columns, shared_panedwindows)
-               return panedgrid_widget
-
-       def add_widget(self, panedgrid_widget, shared_rows=[], shared_columns=[], shared_panedwindows=[]):
-
-               if shared_rows == 'all':
-                       shared_rows = range(self.numberOfSharedRows)
-
-               if shared_columns == 'all':
-                       shared_columns = range(self.numberOfSharedColumns)
-
-               widget_bundle = {       'panedgrid_widget': panedgrid_widget,
-                                                       'shared_rows' : shared_rows,
-                                                       'shared_columns': shared_columns,
-                                                       'shared_panedwindows': shared_panedwindows
-                                               }
-
-               self.__connected_widgets[str(panedgrid_widget)] = widget_bundle
-
-       def delete_widget(self, widget_reference):
-               del self.__connected_widgets[str(panedgrid_widget)]
-
-       def update(self):
-               self.panedwindow_conexion.clear()
-
-               height_list = [0]*self.numberOfSharedRows
-               width_list = [0]*self.numberOfSharedColumns
-
-               for bundle_INFO in self.__connected_widgets.values():
-                       panedgrid_widget = bundle_INFO['panedgrid_widget']
-                       shared_panedwindows = bundle_INFO['shared_panedwindows']
-                       shared_rows = bundle_INFO['shared_rows']
-                       shared_columns = bundle_INFO['shared_columns']
-
-                       if not panedgrid_widget.builded:
-                               panedgrid_widget.build()
-
-
-                       if shared_panedwindows == 'all':
-                               shared_panedwindows = range(len(panedgrid_widget.panedwindows))
-
-                       for conexion_index, panedwindow_index in enumerate(shared_panedwindows):
-                               internal_panedwindow = panedgrid_widget.panedwindows[panedwindow_index]
-                               self.panedwindow_conexion.add_widget(internal_panedwindow, tag=conexion_index)
-
-                               pane_indices = range(*internal_panedwindow.index_range)
-
-                               if panedgrid_widget.orient == HORIZONTAL:
-                                       shared_columns.extend(pane_indices)
-                               else:
-                                       shared_rows.extend(pane_indices)
-
-
-                       shared_rows = sorted(set(shared_rows))
-                       shared_columns = sorted(set(shared_columns))
-
-                       if self.numberOfSharedRows != len(shared_rows):
-                               raise Exception("The number of shared rows %s is not equal to %s." % (len(shared_rows), self.numberOfSharedRows) )
-                       if self.numberOfSharedColumns != len(shared_columns):
-                               raise Exception("The number of shared columns %s is not equal to %s." % (len(shared_columns), self.numberOfSharedColumns) )
-
-                       bundle_INFO['shared_rows'] = shared_rows
-                       bundle_INFO['shared_columns'] = shared_columns
-
-                       for position_in_height_list, row_index in enumerate(shared_rows):
-                               height_list[position_in_height_list] = max(
-                                                                                               height_list[position_in_height_list],
-                                                                                               panedgrid_widget.get_row_height( row_index )
-                                                                                               )
-
-
-                       for position_in_width_list, column_index in enumerate(shared_columns):
-                               width_list[position_in_width_list] = max(
-                                                                                               width_list[position_in_width_list],
-                                                                                               panedgrid_widget.get_column_width( column_index )
-                                                                                               )
-
-               for bundle_INFO in self.__connected_widgets.values():
-
-                       for positionInList, rowIndex in enumerate(bundle_INFO['shared_rows']):
-                               bundle_INFO['panedgrid_widget'].rowconfigure(rowIndex, height = height_list[positionInList])
-
-                       for positionInList, columnIndex in enumerate(bundle_INFO['shared_columns']):
-                               bundle_INFO['panedgrid_widget'].columnconfigure(columnIndex, width = width_list[positionInList])
-
 
class PanedGrid(Frame):
       
def __init__(self, master, orient=HORIZONTAL, minsize=20, columnWidths = {}, rowHeights={}, fixedPanes = []):
               
Frame.__init__(self,master)

History