Vorarbeiten
Auf dieser Seite sollen Vorabüberlegungen zur Erstellung eines Tabellen Widgets für Tkinter gesammelt werden. Projektbörse --> Tk-Tabellen-Widget
Die Idee zu dem Tabellen Widget ist im python-forum.de entstanden. Dort gibt es 2 Threads zu dem Thema:
Da das Ganze noch in einer sehr frühen Planungsphase befindet, mag es etwas wirr aussehen.
Rahmenbedingungen:
1.
Dem Tabellenobjekt wird eine Datenstruktur and den Konstruktor oder an eine Updatemethode übergeben, die die in Tabellenform auszugebenden Elemente enthält. Diese Datenstruktur kann sein:
- a) eine Liste, wobei jedes Element einem Datensatz entspricht
- b) ein Dictionary, wobei jedes Element einem Datensatz und dessen Schlüssel der Tabellen-zeilenbeschriftung entspricht.
Jeder Datensatz kann wiederum aus einem der folgenden Elemente bestehen:
- I) eine Liste, wobei jedes Element einer Spalte der Tabelle zugeordnet wird
- II) ein Dictionary, wobei jedes Element in die Spalte eingetragen wird, deren Spaltenkopf-beschriftung dem Schlüssel des Elements entspricht.
Grundsätzlich sind als Dictionaries für komplexe Tabellen besser geeignet, da die Spalten-und Zeilenbeschriftung automatisch gehandhabt wird. Die Listenversion ist gut geeignet, um simple Listenstrukturen grafisch darzustellen.
Requirement (Req. #) - Beschreibung
- Item: mic 1
- Die Tabelle muss in einem konstanten, rechteckigen Feld ausgeführt werden. Veränderungen der Spaltenbreite oder Zeilenhöhe darf das gesamte Widget weder verschieben noch in der Größe verändern (wie, wenn man eine Grid-Manager in einem Frame verwendet)
- Item: mic 2
- Es wird die Ausdehung des Nuzungsbereichs durch die Übergebenen Daten definiert. Die Breite entspricht der Elementzahl des längsten Datensatzes, die Höhe der Anzahl der Datensätze. Die Scrollbars müssen bei jedem Update an diese Dimensionen angepasst werden. Per Argument lässt sich optional eine Maximalgröße der Tabelle definieren, die unter keinen Umständen überschritten werden darf.
- Item: mic 3 + snede 3
- Es muss "Scrollbars" am rechten und unteren Rand geben, die automatisch auf den genutzten Tabellenabschnitt dimensioniert werden. Über ein Flag wird gesteuert, ob die Scrollbars immer sichtbar sind, oder nur wenn der benötigte Bereich größer ist als der sichtbare Auschnitt.
- Item: mic 4
- Zpaltenbreiten sollen einen Vorgabewert haben, aber auch vom Anwender änderbar sein.
- Item: mic 5
- Das Widget soll mit Python 2.2 kompatibel sein. D.h. Vermeidung der builtin-Funktion sorted sowie aller Argumente von list.sort(), etc. Hier bin ich aber gesprächsbereit (darum soll), wenn es zu viele Nachteile birgt. Dann muss man eben eine Extraversion für 2.2 erzeugen
- Item: mic 6
- Das Widget wird in Klassen mit verschiedenen Funktionalitätsausprägungen organisiert.
Erster Ansatz für Funktionsaufteilung:
------------------+------------------------------------------------------------
Klasse | Funktionsumfang
------------------+------------------------------------------------------------
BaseTable | grundlegende Funktionen
| - zum Anzeigen von Werten in einer Tabelle
| - Werte intern (nicht über die GUI) updaten
| - internes (nicht über die GUI) Sortieren von Datensätzen
| - internes (nicht über die GUI) Ändern der Spaltenbreite
| - Zugriff auf einzelne Werte
------------------+------------------------------------------------------------
EditableTable | erweiterte Funktionen
| - Definition von Tabellenbereichen (Auswahl) fuer weitere
| Bearbeitung
| - Standardauswahlen für Spalten, Zeilen und Alles definieren
| und mit Zeilen-/Spaltenköpfen verknüpfen
| - ändern der Farbdarstellung einzelner Zellen bzw. einer Auswahl
| - Sortieren per Rechtsklick auf Spaltenkopf + Contextauswahl
| - Ändern der Spaltenbreite mit der Maus
| - Andern der Zeilenhöhe mit der Maus
===============================================================- Item: red 1
- Die (public) Widget-Methoden sollten weitestgehend die Namen derer erhalten, die schon in Tkinter implementiert sind, um eine intuitive Nutzung zu ermöglichen.
- Item: red 2
- Es sollten die üblichen Varianten des Exportierens bzw. Importierens ermöglicht werden, sprich CSV etc.
- Item: red 3
- Sortieren der Zeilen sollten Spaltenweise on the fly durch einfaches Klicken auf den Spaltennamen möglich sein. Wichtig hierbei ist meiner Meinung nach, dass man nicht nur nach einer Spalte sortieren kann, sondern zur weiteren Sortierung weitere Spalten hinzuziehen kann, wobei man sich Gedanken machen müsste, ob die Sortierreihenfolge gemäß der Anklickreihenfolge ausreichend oder eher verwirrend ist.
- Item: red 4
Nach Markieren einer beliebigen Anzahl von Zellen sollte deren Inhalt sowohl horizontal wie vertikal per Drag & Drop verschoben werden können.
- Item: red 5
- (erst einmal niedrige Prioriät) Referenzieren von Zellen untereinander, sprich der Inhalt von Zelle A wird in Zelle B dargestellt; Unterstützen einfacher Formeln wie Zelle A + 5 und Implementierung einfacher Funktionen wie Summe, Mittelwert, ..
- Item: red 6
- Die farbliche Gestaltung sollte variable sein und sich wiederum an den typischen Methoden- und Parameternamen von Tkinter orientieren.
- Item: red 7
- Man sollte auswählen können, ob und wie ein Raster dargestellt wird.
- Item: snede 1
- Ich möchte einfach dem Widget beim Aufruf (und nachträglich per configure) eine Liste mit Strings für die Überschriften und eine 2-dimensionale Liste für die Daten übergeben.
- Item: snede 2
- Ich will einfach auf einzelne Zellen, Spalten und Zeilen zugreifen können - um den Inhalt zu ändern, bzw das Erscheinungsbild zu beeinflussen - um den Inhalt auszulesen (Spalten und Zeilen sond dann natürlich Listen)
- Item: snede 4
- Resize sollte so funktionieren, wie der verwendete Layoutmanager es vorgibt. - wird der Elternframe größer als die Tabelle gezogen werden, sollten sich alle Felder gleichmäßig vergrößern
Autor
Mr_Snede -->Mail: mr-snede bei web.de