probleme mit tabelle

Code-Stücke können hier veröffentlicht werden.
Antworten
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Freitag 12. August 2005, 16:17

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
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Freitag 12. August 2005, 19:51

Hi!


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

Gruß, mawe
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Sonntag 14. August 2005, 10:59

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
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Hajo

Freitag 23. September 2005, 11:45

Ja aber du musst ers noch das backend Flashen, damit die insert auf string array steht.
Mir war langweilig. :oops:
Antworten