tkinter table/tabelle

Fragen zu Tkinter.
Antworten
evil knievel
User
Beiträge: 11
Registriert: Dienstag 29. Juni 2010, 15:48

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
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.
Zuletzt geändert von problembär am Dienstag 29. Juni 2010, 17:55, insgesamt 2-mal geändert.
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.
evil knievel
User
Beiträge: 11
Registriert: Dienstag 29. Juni 2010, 15:48

dann Qt für die Platformunabhängigkeit

thx
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

wxWidgets-wxPython, Gtk-PyGtk, Qt-PyQT sind alle plattfromunabhängig
the more they change the more they stay the same
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
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.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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:
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten