Seite 1 von 1

tkinter table/tabelle

Verfasst: Dienstag 29. Juni 2010, 15:58
von evil knievel
Hi pythons :D ,

ich beschäftige mich seit kurzem mit Tkinter und stelle mir jetzt die frage wie man eine anständige tabelle erstellen kann. Habe es mit gridding versucht, aber komme dabei nur zu einem schlechten resultat. +++ Falsch ! um mich genauer auszudrücken meine ich eine Listbox die wie eine Tabelle unterteilt ist +++ wäre das möglich ? oder muss ich wirklich unabhängige elemente erzeugen und dann grid benutzen ? jemand eine idee ?

danke

evil

Re: tkinter table/tabelle

Verfasst: Dienstag 29. Juni 2010, 17:37
von problembär
Hi evil (netter Name, übrigens),

ja, Tkinter ist bekannt dafür, anders als andere Toolkits kein Table-Widget mitzuliefern.
Aber es wurden schon ein paar als Add-on geschrieben, z.B.

http://sourceforge.net/projects/tkintertable/

Ich glaube, das Problem ist, daß man in Tabellen oft sehr große Datenmengen (z.B. eine ganze Datenbank) darstellen will, und das etwas über die Möglichkeiten von Tkinter hinausgeht.
Aber bei bis zu ein paar Hundert Zeilen solltest Du z.B. mit dem obigen Add-on schon klarkommen.

Gruß

Edit: In der Doku von Qt3 zum QTable-Widget heißt es z.B.
QTable efficiently supports very large tables, for example, tables one million by one million cells are perfectly possible.
Find' ich immer wieder beeindruckend. Das meinte ich: Da müßte Tkinter wohl passen. Aber ich brauche so große Tabellen eigentlich auch nicht; weshalb Tkinter für mich schon richtig ist.

Re: tkinter table/tabelle

Verfasst: Dienstag 29. Juni 2010, 17:39
von BlackJack
@evil knievel: Es gibt mehrere Tabellen-Widgets im Netz. Ist halt nicht Bestandteil der Grundausstattung von `Tkinter`. Vielleicht möchtest Du auch ein anderes GUI-Toolkit verwenden.

Re: tkinter table/tabelle

Verfasst: Mittwoch 30. Juni 2010, 09:40
von evil knievel
dann Qt für die Platformunabhängigkeit

thx

Re: tkinter table/tabelle

Verfasst: Mittwoch 30. Juni 2010, 12:55
von Dav1d
wxWidgets-wxPython, Gtk-PyGtk, Qt-PyQT sind alle plattfromunabhängig

Re: tkinter table/tabelle

Verfasst: Sonntag 4. Juli 2010, 13:54
von Pascal
evil knievel hat geschrieben:Habe es mit gridding versucht, aber komme dabei nur zu einem schlechten resultat.

Code: Alles auswählen

class TkTabelle:

    def __init__(self, frame, zeilen, spalten):

        self.frame = frame
        

        self.zeilen = zeilen
        self.spalten = spalten
        self.tabelle = []

        for z in range(zeilen):

            self.tabelle.append([])

            for s in range(spalten):

                entry = tk.Entry(frame)
                entry.grid(row=z, column=s)
                self.tabelle[-1].append(entry)


    def einfuegen(self, zeile, spalte, text):
        '''Fügt text ein'''
        
        self.tabelle[zeile-1][spalte-1].insert('end', text)

Ist doch recht einfach mit grid. Da kannst du einfach Funktionen hinzufügen. Und auch mit Scrollbar ist eine Tabelle möglich. Du musst deswegen nicht von Tkinter umsteigen.

Re: tkinter table/tabelle

Verfasst: Montag 19. Juli 2010, 12:09
von Michael Schneider
Pascal hat geschrieben:Ist doch recht einfach mit grid. Da kannst du einfach Funktionen hinzufügen. Und auch mit Scrollbar ist eine Tabelle möglich. Du musst deswegen nicht von Tkinter umsteigen.
Au ja, da bin ich jetzt aber gespannt, wie Du dem Frame Scrollbars hinzufügst. :D
Ist kein Scherz, bitte poste den Code mal mit Scrollbars. Bin sehr interessiert.

Ich habe mir extra ein ScrolledFrame geschrieben, damit ich das Gridding eines Frames und die Scrollfunktion eines Canvas in Kombination nutzen kann. Wenn das auch direkt geht, kann ich mir das ja in Zukunft schenken.

Evil, ich würde mich auch nicht von Blacky gleich verschrecken lassen. Der hat wohl schon jedem, der hier im Tkinter-Forum ein Problem gepostet hat, empfohlen, ein anderes Toolkit zu verwenden. *lol*

Ich muss ihm aber recht geben, dass wenn man wirklich schnell eine Tabelle braucht und dabei auf gehobenen Komfort nicht verzichten will, UND die Installation eines anderen GUI Toolkits möglich ist, dass man sich dann auch mal alternativen ansehen könnte.

Aber prinzipiell kann man auch mit einem ScrolledFrame schon eine Menge machen.

Grüße,
Michael

Re: tkinter table/tabelle

Verfasst: Montag 19. Juli 2010, 14:00
von BlackJack
@Michael Schneider: Also ich denke ich gehöre eigentlich nicht zu den Tkinter-Gegnern die sofort ein anderes Toolkit empfehlen. Für einfache Sachen die mit den gegebenen Widgets auskommen finde ich es sogar ganz gut.

Re: tkinter table/tabelle

Verfasst: Montag 19. Juli 2010, 15:52
von Michael Schneider
BlackJack hat geschrieben:@Michael Schneider: Also ich denke ich gehöre eigentlich nicht zu den Tkinter-Gegnern die sofort ein anderes Toolkit empfehlen. Für einfache Sachen die mit den gegebenen Widgets auskommen finde ich es sogar ganz gut.
Ok, ok. Aber von außen kommt es einem manchmal so vor. :) Man kann ja mal in den Archiven stöbern. :P

Re: tkinter table/tabelle

Verfasst: Montag 19. Juli 2010, 19:40
von Pascal
Michael Schneider hat geschrieben: Au ja, da bin ich jetzt aber gespannt, wie Du dem Frame Scrollbars hinzufügst. :D
Ist kein Scherz, bitte poste den Code mal mit Scrollbars. Bin sehr interessiert.
Ich hatte mir dazu Hilfe aus dem Forum geholt. Aus dem Frame ist ein Canvas geworden.

Code: Alles auswählen

class TkScrollTabelle:

    def __init__(self, frame, zeilen, spalten, height): 

        self.frame = frame 

        self.frame2 = tk.Frame(self.frame) 
        self.frame2.grid(row=0, column=0, sticky='nswe') 
        self.frame2.grid_rowconfigure(0, weight=1) 
        self.frame2.grid_columnconfigure(0, weight=1) 

        
        

        self.zeilen = zeilen 
        self.spalten = spalten 
        self.tabelle = [] 

        self.canvas = tk.Canvas(self.frame2, bd=0, height=height) 

        self.canvas.grid(row=0, column=0) #, sticky='nswe') 

        self.xpos = 0 
        self.ypos = 0 
        for z in range(zeilen): 

            self.tabelle.append([]) 

            for s in range(spalten): 

                entry = tk.Entry(self.canvas) 
                entry.grid(row=z, column=s) 
                self.canvas.create_window(self.xpos, self.ypos, window=entry, 
                    anchor='nw') 
                self.xpos += entry.winfo_reqwidth() 
                self.tabelle[-1].append(entry) 
            self.xpos = 0 
            self.ypos += entry.winfo_reqheight() 

        
        yscrollbar = tk.Scrollbar(self.frame2) 
        yscrollbar.grid(row=0, column=1, sticky='ns') 
        yscrollbar.config(command=self.canvas.yview) 
        xpos, ypos, width, height = self.canvas.bbox('all') 
        self.canvas.config(width=width, yscrollcommand=yscrollbar.set) 
        self.canvas.config(scrollregion=(xpos, ypos, width, height)) 
Michael Schneider hat geschrieben:Ich habe mir extra ein ScrolledFrame geschrieben, damit ich das Gridding eines Frames und die Scrollfunktion eines Canvas in Kombination nutzen kann.
Davon würde mich der Code auch mal interessieren. :lol:

Re: tkinter table/tabelle

Verfasst: Montag 19. Juli 2010, 23:58
von Michael Schneider
Pascal hat geschrieben:
Michael Schneider hat geschrieben: Au ja, da bin ich jetzt aber gespannt, wie Du dem Frame Scrollbars hinzufügst. :D
Ist kein Scherz, bitte poste den Code mal mit Scrollbars. Bin sehr interessiert.
Ich hatte mir dazu Hilfe aus dem Forum geholt. Aus dem Frame ist ein Canvas geworden.
Hey, das ist jetzt aber geschummelt. :lol:

Aber sag mal, warum hast Du das Entry-Widget mit grid und create eingefügt?

Code: Alles auswählen

                entry.grid(row=z, column=s)
                self.canvas.create_window(self.xpos, self.ypos, window=entry,
                    anchor='nw') 
Was erwartest Du davon?
Willst Du dem grid-Geometriemanager erlauben, das Widget zu platzieren, oder möchtest Du ihm mit self.xpos, self.ypos selbst einen Platz zuweisen? Apropos, weshalb speicherst Du die temporären Variablen xpos und ypos in der Instanz?
Und was passiert bei Änderungen der Zellengröße??

Ich werde mal mein Widget rauskramen und im Bereich Codesnippets posten, sobald ich dazu komme. Man, ich sollte dringend mal früher ins Bett kommen. :D

Re: tkinter table/tabelle

Verfasst: Dienstag 20. Juli 2010, 22:36
von Pascal
Ja, ein bischen geschummelt ist es schon :twisted:
Michael Schneider hat geschrieben: Aber sag mal, warum hast Du das Entry-Widget mit grid und create eingefügt?

Code: Alles auswählen

                entry.grid(row=z, column=s)
                self.canvas.create_window(self.xpos, self.ypos, window=entry,
                    anchor='nw') 
Frag wuf ;) http://www.python-forum.de/viewtopic.php?f=18&t=22103
Ja, die Zeile ist wohl überflüssig....

self.xpos und self.ypos werden noch bei manchen methoden gebraucht (z.B. beim Zeilen hinzufügen)

Um die Zellengröße zu ändern, würde ich die Tabelle neu erstellen mit größeren Zellen. Hab ich aber für meine Zwecke nicht gebraucht.
Ich hab aber noch eine Version, wo die Spaltenbreite angegeben werden kann.

Re: tkinter table/tabelle

Verfasst: Dienstag 20. Juli 2010, 23:18
von Michael Schneider
Pascal hat geschrieben:self.xpos und self.ypos werden noch bei manchen methoden gebraucht (z.B. beim Zeilen hinzufügen)
Aber Du nimmst doch schon canvas.bbox zum Ermitteln der Größe. :?:
Sorry, ich habe den Code nur überflogen. Vielleicht braucht man die ja irgendwo für etwas, das ich übersehen habe.