Seite 1 von 1

probleme mit tabelle

Verfasst: Freitag 12. August 2005, 16:17
von jAN
mir war mal wieder langweilig und da hab ich das folgende script geschrieben. das ist eine tabelle in der man wie bei excel direkt was reinschreiben kann. das funktioniert ja soweit ganz gut. das einzige problem ist noch die insert-funktion, die noch nicht funktioniert.
könnt ihr mir da helfen??
hier der

Code: Alles auswählen

from Tkinter import *
class Table:
    def __init__(self,master,width=5,height=3):
        self.frame=Frame(master)
        self.width=width
        self.height=height
        self.active=None
        self.table=self.make_table()
    def entry_double_klick(self,event):
        if event.widget['state']==DISABLED:
            if self.active:
                self.active['state']=DISABLED
            self.active=event.widget
            self.active['state']=NORMAL
            self.active.focus()
    def entry_klick(self,event):
        if event.widget!=self.active:
            if self.active:
                self.active['state']=DISABLED
            self.active=None
        
    def make_table(self):
        table=[]
        for row in range(0,self.height):
            table.append([])
            for column in range(0,self.width):
                table[row].append(Entry(self.frame,
                                             disabledbackground='white',
                                             disabledforeground='black',
                                             cursor='arrow',relief=GROOVE))
                table[row][-1].grid(column=column,row=row)
                table[row][-1]['state']=DISABLED
                table[row][-1].bind('<Double-Button-1>',self.entry_double_klick)
                table[row][-1].bind('<Button-1>',self.entry_klick)
        return table
        
    def pack(self,**kw):
        self.frame.pack(**kw)
    def insert(self,row=1,column=1,string=''):
        self.table[row+1][column+1].insert('end',string)
root=Tk()
t=Table(root,width=5,height=10)
t.pack()
t.insert(row=3,column=3,string='HELLO')
root.mainloop()
schon mal danke im voraus!
jAN

Verfasst: Freitag 12. August 2005, 19:51
von mawe
Hi!


Du musst den state des Entrys in das inserted werden soll erstmal auf NORMAL setzen.
Warum sind die denn alle disabled?

Gruß, mawe

Verfasst: Sonntag 14. August 2005, 10:59
von jAN
thx!
aber ich hab das problem schon anders gelöst.
ich habe jedem entry eine StringVar zugewiesen.
funktioniert prima!

warum die alle disabled sind??
damit man den inhalt erst nach doppelklick ändern kann.

hier noch ma meine neuste version:

Code: Alles auswählen

from Tkinter import *

class Table:
    def __init__(self,master,cw=None,width=5,height=3,text=None,names=0,data=None):
        self.frame=LabelFrame(master,text=text)
        self.master=master
        self.width=width
        self.height=height
        self.active=None
        self.text=[]
        if cw:
            self.columnwidth=cw
        else:
            self.columnwidth=[12]*self.width
        self.table=self.make_table()
        if names:
            if data:
                self.make_first_line(data)
            else:
                raise Exception('No Data')
    def entry_double_klick(self,event):
        if event.widget['state']==DISABLED:
            if self.active:
                self.active['state']=DISABLED
            self.active=event.widget
            self.active['state']=NORMAL
            self.active.focus()
    def entry_klick(self,event):
        if event.widget!=self.active:
            if self.active:
                self.active['state']=DISABLED
            self.active=None
        
    def make_table(self):
        table=[]
        for row in range(0,self.height):
            table.append([])
            self.text.append([])
            for column in range(0,self.width):
                self.text[row].append(StringVar(self.master))
                table[row].append(Entry(self.frame,justify=CENTER,width=self.columnwidth[column],
                                        textvariable=self.text[row][-1],
                                             disabledbackground='white',
                                             disabledforeground='black',
                                             cursor='arrow',relief=GROOVE))
                table[row][-1].grid(column=column+1,row=row+1,ipadx=1.0/self.width,
                                    ipady=1.0/self.height)
                table[row][-1]['state']=DISABLED
                table[row][-1].bind('<Double-Button-1>',self.entry_double_klick)
                table[row][-1].bind('<Button-1>',self.entry_klick,'+')
        return table
    def make_first_line(self,data):
        first=[]
        ins=self.width+self.height-2
        first.append(Label(self.frame))
        first[-1].grid(row=0,column=0)
        for column in range(1,self.width+1):
            first.append(Label(self.frame,text=data[column-1]))
            first[-1].grid(row=0,column=column)
        for row in range(1,self.height+1):
            first.append(Label(self.frame,text=data[self.width-1+row]))
            first[-1].grid(row=row,column=0)
        
    def pack(self,**kw):
        self.frame.pack(**kw)
    def insert(self,row=1,column=1,string=''):
        self.text[row-1][column-1].set(string)
    def insert_line(self,data_list,row):
        for i in range(0,self.width):
            self.text[row-1][i].set(data_list[i])
    def read_all(self):
        text_out=[]
        for row in range(0,self.height):
            text_out.append([])
            for column in range(0,self.width):
                text_out[row].append(self.text[row][column].get())
        return text_out
    def read_cell(self,row=1,column=1):
        return self.read_all()[row-1][column-1]

if __name__=='__main__':
    def read_this():
        for i in t.read_all():
            print i
        print
    root=Tk()
    t=Table(root,width=9,height=30,
            text='My Table',names=1,
            data=['Name','Vorname','Handynr.','PLZ','Wohnort','Stasse','Nr.','Telefon','Geburtstag']+
            ['Nr.%s'%x for x in range(1,31)],cw=[12,12,12,5,12,14,3,12,10])
    t.pack()
    t.insert_line(['Mustermann','Max','0123456789','99999','Musterstadt','Musterstr.','13','0123456789','09.09.1999'],1)
    but=Button(root,text='read',command=read_this)
    but.pack(side=LEFT)
    root.mainloop()

gruß jAN

Verfasst: Freitag 23. September 2005, 11:45
von Hajo
Ja aber du musst ers noch das backend Flashen, damit die insert auf string array steht.
Mir war langweilig. :oops: