Tkinter - DataGrid v0.1

363 views
Skip to first unread message

Tarek Amr

unread,
Jan 14, 2006, 8:27:20 AM1/14/06
to pyth...@googlegroups.com
Tkinter doesn't have a DataGrid widget simillar to that in MS ASP.NET and VB, so here is a trial to make one using the Tkinter Label class

class DGLabel(Label):
    def set_position(self,row,col):
        self.row = row
        self.col = col
    def get_position(self):
        if self.row and self.col:
            return (self.row,self.col)
        else:
            return (-1,-1)
       
class DataGreid:
    def __init__(self,parent,rows=3,cols=3,titles=[],titlebg="#ff5566",cellbg1="#eeeeee",cellbg2="#aaaaaa"):
        self.parent = parent
        self.rows = rows
        self.cols = cols
        self.titlebg = titlebg
        self.cellbg1 = cellbg1
        self.cellbg2 = cellbg2
        self.titles = []
        self.cells = []
        self.menu = Menu(parent,tearoff=0)
        self.menu.add_command(label="Do This")
        self.menu.add_command(label="Do That")
        for i in range(self.cols):
            if len(titles) < self.cols or titles == None:
                title = "Column (%d)" % i
            else:
                title = titles[titles.keys()[i]]
            self.titles.append(Label(self.parent,text=title,bg=self.titlebg,relief=GROOVE))
            self.titles[i].grid(row=0,column=i,sticky=E+W)
        for j in range(self.rows):
            self.cells.append([])
            if j % 2 == 0:
                cellbg = self.cellbg1
            else:
                cellbg = self.cellbg2
            for i in range(self.cols):
                    self.cells[j].append(DGLabel(self.parent,text="Empty",bg=cellbg,relief=GROOVE))
                    self.cells[j][i].set_position(j,i)
                    self.cells[j][i].grid(row=j+1,column=i,sticky=E+W)
                    self.cells[j][i].bind("<Button-1>", self.cell_click)
                    self.cells[j][i].bind("<Button-3>", self.popup)
    def append_row(self,data):
        if len(data) == self.cols:
            self.rows = self.rows + 1
            if (self.rows - 1) % 2 == 0:
                cellbg = self.cellbg1
            else:
                cellbg = self.cellbg2
            self.cells.append([])
            for i in range(self.cols):
                self.cells[self.rows - 1].append(DGLabel(self.parent,text=data[i],bg=cellbg,relief=GROOVE))
                self.cells[self.rows - 1][i].set_position(self.rows - 1,i)
                self.cells[self.rows - 1][i].grid(row=self.rows+1,column=i,sticky=E+W)
                self.cells[self.rows - 1][i].bind("<Button-1>", self.cell_click)
                self.cells[self.rows - 1][i].bind("<Button-3>", self.popup)
    def set_cell(self,cell,data):
        cell.config(text=data)
    def get_cell(self,cell):
        data = cell.cget("text")
        return data
    def cell_click(self,event):
        data = self.get_cell(event.widget)
        print "Cell Data: ", data
        return data
    def popup(self,event):
        self.menu.post(event.x_root,event.y_root)

--
Best Regards,
Tarek Amr

tare...@gmail.com

unread,
Jan 16, 2006, 6:36:00 AM1/16/06
to python-eg
class ScrolledFrame(Frame):
def __init__(self, master, **kw):
apply(Frame.__init__, (self, master), kw)
yscrollbar = Scrollbar(self, orient=VERTICAL)
xscrollbar = Scrollbar(self, orient=HORIZONTAL)
self.canvas = Canvas(self,bd=0,
highlightthickness=0,yscrollcommand=yscrollbar.set,xscrollcommand=xscrollbar.set)
yscrollbar.config(command=self.canvas.yview)
yscrollbar.pack(fill=Y, side=RIGHT)
xscrollbar.config(command=self.canvas.xview)
xscrollbar.pack(fill=X, side=BOTTOM)
self.canvas.pack(expand=1, fill=BOTH, side=LEFT, )
self.canvas.xview("moveto", 0)
self.canvas.yview("moveto", 0)
self.inner = Frame(self.canvas, bg="blue")
self.inner.bind('<Configure>', self.__configure)
self.canvas.create_window(0, 0, window=self.inner, anchor=NW)
def __configure(self, event):
size = self.inner.winfo_reqwidth(),
self.inner.winfo_reqheight()
self.canvas.config(scrollregion="0 0 %s %s" % size)

class DGLabel(Label):
def __init__(self,app,master,row,col,**kw):
apply(Label.__init__,(self,master),kw)
self.app = app


self.row = row
self.col = col

self.menu = Menu(self)
self.menu.add_command(label="Only this value", command=self.test)
self.menu.add_command(label="Do That", command=self.test)
self.bind("<Button-3>", self.popup)


def get_position(self):
if self.row and self.col:
return (self.row,self.col)
else:
return (-1,-1)

def get_text(self):
return self.cget("text")
def get_head(self):
return self.app.titles[self.col].cget("text")
def popup(self,event):
self.menu.post(event.x_root, event.y_root)
def test(self):
self.app.app.reload(self)

class DataGrid:
def
__init__(self,app,parent,heads=[],data=[],titlebg="#ff5566",cellbg1="#eeeeee",cellbg2="#aaaaaa"):
self.app = app
self.parent = parent


self.titlebg = titlebg
self.cellbg1 = cellbg1
self.cellbg2 = cellbg2
self.titles = []
self.cells = []

self.cellsframe = ScrolledFrame(self.parent)
self.cellsframe.grid(row=1,column=0,sticky=E+W)
i = 0
for head in heads:
self.titles.append(Label(self.cellsframe.inner,text=head[1],bg=self.titlebg,relief=GROOVE))
self.titles[i].grid(row=0,column=i,sticky=E+W)
i = i + 1
j = 0
for record in data:


self.cells.append([])
if j % 2 == 0:
cellbg = self.cellbg1
else:
cellbg = self.cellbg2

i = 0
for field in record:
self.cells[j].append(DGLabel(self,self.cellsframe.inner,row=j,col=i,text=field,bg=cellbg,relief=GROOVE))
self.cells[j][i].grid(row=j+1,column=i,sticky=E+W)
i = i + 1
j = j + 1

Reply all
Reply to author
Forward
0 new messages