from Tkinter import *
class PannedGrid(PanedWindow):
def __init__(self, master, tableOfWidgets, minsize='auto'):
PanedWindow.__init__(self,master,orient=HORIZONTAL )
self.numberOfRows = len(tableOfWidgets)
self.numberOfColumns = len(tableOfWidgets[0])
RowHeightList = [0]*self.numberOfRows
ColumnWidthList = [0]*self.numberOfColumns
self.listOfColumnsFrames = []
self.gridOfCellWidgets = \
[[None for j in range(self.numberOfColumns)] for i in range(self.numberOfRows)]
for j in range(self.numberOfColumns):
columnFrame = Frame(self)
columnFrame.pack(side=LEFT)
columnFrame.pack_propagate(False)
self.add(columnFrame, minsize=20)
self.listOfColumnsFrames.append(columnFrame)
for i in range(self.numberOfRows):
cellFrame = Frame(columnFrame, bd=1, relief=SUNKEN)
cellFrame.pack(expand=YES, fill=X)
cellFrame.pack_propagate(False)
widgetDefinition = tableOfWidgets[i][j]
classObject, kwargs = widgetDefinition
widget = classObject(cellFrame, **kwargs)
widget.pack(expand=YES, fill=BOTH)
widget.pack_propagate(False)
RowHeightList[i] = max(RowHeightList[i],widget.winfo_reqheight())
ColumnWidthList[j] = max(ColumnWidthList[j],widget.winfo_reqwidth())
self.gridOfCellWidgets[i][j]= cellFrame
tableHeight = sum(RowHeightList)
for indexColumn, frameColumn in enumerate(self.listOfColumnsFrames):
frameColumn.configure(width=ColumnWidthList[indexColumn], height=tableHeight)
if minsize == 'auto':
self.paneconfigure(frameColumn, minsize=ColumnWidthList[indexColumn])
elif type(minsize) is int:
self.paneconfigure(frameColumn, minsize=minsize)
else:
raise Exception("Minsize must be 'auto' or an integer.")
for i in range(self.numberOfRows):
for j in range(self.numberOfColumns):
self.gridOfCellWidgets[i][j].configure(height=RowHeightList[i])
def test():
import random
root = Tk()
numRows=4
numColumns= 5
tableGrid = []
listOfColors = ['blue', 'red','green', 'yellow']
listOfTexts = ['Something', 'Another thing', 'Word','This is still longer']
tkinterWidgets = [ Label, Button, Checkbutton]
for i in range(numRows):
row = []
for j in range(numColumns):
row.append(
[random.choice(tkinterWidgets),
{ 'bg':random.choice(listOfColors),
'text':random.choice(listOfTexts)
}
]
)
tableGrid.append(row)
PannedGrid(root, tableGrid,minsize=20).pack(expand=YES, fill=X, pady=2, padx='2m')
root.mainloop()
if __name__ == '__main__':
test()
Diff to Previous Revision
--- revision 1 2014-05-03 17:28:01
+++ revision 2 2014-05-03 17:34:00
@@ -1,62 +1,61 @@
from Tkinter import *
class PannedGrid(PanedWindow):
- def __init__(self, master, tableOfWidgets, minsize='auto'):
- PanedWindow.__init__(self,master,orient=HORIZONTAL )
+ def __init__(self, master, tableOfWidgets, minsize='auto'):
+ PanedWindow.__init__(self,master,orient=HORIZONTAL )
- self.numberOfRows = len(tableOfWidgets)
- self.numberOfColumns = len(tableOfWidgets[0])
- RowHeightList = [0]*self.numberOfRows
- ColumnWidthList = [0]*self.numberOfColumns
+ self.numberOfRows = len(tableOfWidgets)
+ self.numberOfColumns = len(tableOfWidgets[0])
+ RowHeightList = [0]*self.numberOfRows
+ ColumnWidthList = [0]*self.numberOfColumns
- self.listOfColumnsFrames = []
+ self.listOfColumnsFrames = []
- self.gridOfCellWidgets = \
- [[None for j in range(self.numberOfColumns)] for i in range(self.numberOfRows)]
+ self.gridOfCellWidgets = \
+ [[None for j in range(self.numberOfColumns)] for i in range(self.numberOfRows)]
- for j in range(self.numberOfColumns):
+ for j in range(self.numberOfColumns):
+ columnFrame = Frame(self)
+ columnFrame.pack(side=LEFT)
+ columnFrame.pack_propagate(False)
+ self.add(columnFrame, minsize=20)
+ self.listOfColumnsFrames.append(columnFrame)
- columnFrame = Frame(self)
- columnFrame.pack(side=LEFT)
- columnFrame.pack_propagate(False)
- self.add(columnFrame, minsize=20)
- self.listOfColumnsFrames.append(columnFrame)
+ for i in range(self.numberOfRows):
+ cellFrame = Frame(columnFrame, bd=1, relief=SUNKEN)
+ cellFrame.pack(expand=YES, fill=X)
+ cellFrame.pack_propagate(False)
+ widgetDefinition = tableOfWidgets[i][j]
- for i in range(self.numberOfRows):
- cellFrame = Frame(columnFrame, bd=1, relief=SUNKEN)
- cellFrame.pack(expand=YES, fill=X)
- cellFrame.pack_propagate(False)
- widgetDefinition = tableOfWidgets[i][j]
+ classObject, kwargs = widgetDefinition
- classObject, kwargs = widgetDefinition
+ widget = classObject(cellFrame, **kwargs)
+ widget.pack(expand=YES, fill=BOTH)
+ widget.pack_propagate(False)
- widget = classObject(cellFrame, **kwargs)
- widget.pack(expand=YES, fill=BOTH)
- widget.pack_propagate(False)
+ RowHeightList[i] = max(RowHeightList[i],widget.winfo_reqheight())
+ ColumnWidthList[j] = max(ColumnWidthList[j],widget.winfo_reqwidth())
- RowHeightList[i] = max(RowHeightList[i],widget.winfo_reqheight())
- ColumnWidthList[j] = max(ColumnWidthList[j],widget.winfo_reqwidth())
-
- self.gridOfCellWidgets[i][j]= cellFrame
+ self.gridOfCellWidgets[i][j]= cellFrame
- tableHeight = sum(RowHeightList)
+ tableHeight = sum(RowHeightList)
- for indexColumn, frameColumn in enumerate(self.listOfColumnsFrames):
- frameColumn.configure(width=ColumnWidthList[indexColumn], height=tableHeight)
+ for indexColumn, frameColumn in enumerate(self.listOfColumnsFrames):
+ frameColumn.configure(width=ColumnWidthList[indexColumn], height=tableHeight)
- if minsize == 'auto':
- self.paneconfigure(frameColumn, minsize=ColumnWidthList[indexColumn])
- elif type(minsize) is int:
- self.paneconfigure(frameColumn, minsize=minsize)
- else:
- raise Exception("Minsize must be 'auto' or an integer.")
+ if minsize == 'auto':
+ self.paneconfigure(frameColumn, minsize=ColumnWidthList[indexColumn])
+ elif type(minsize) is int:
+ self.paneconfigure(frameColumn, minsize=minsize)
+ else:
+ raise Exception("Minsize must be 'auto' or an integer.")
- for i in range(self.numberOfRows):
- for j in range(self.numberOfColumns):
- self.gridOfCellWidgets[i][j].configure(height=RowHeightList[i])
+ for i in range(self.numberOfRows):
+ for j in range(self.numberOfColumns):
+ self.gridOfCellWidgets[i][j].configure(height=RowHeightList[i])
def test():