wxGrid

Plattformunabhängige GUIs mit wxWidgets.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo,

Ich habe mir vorgenommen mit wxGrid eine Tabelle zu bauen, in der ich kopieren, einfügen, sortieren, Attribute ändern usw. möchte. Sozusagen eine eigene Tabellenverarbeitung.
Das habe ich auch schon relativ gut hinbekommen, nur sind die Funktionen die ich zum Kopieren, Farben ändern, Schriften vergeben, sortieren... geschrieben habe viel zu langsam.
Meine Funktionen zum Kopieren, Ändern ... von Zellenattributen sind folgendermaßen aufgebaut:
Selektierten Bereich über eine verschachtelte Schleife iterieren. Dabei werden für jede Zeile die neuen Werte und Attribute gesetzt.
Beim Kopieren läuft diese Prozedur doppelt ab - beim erstenmal werden die Werte und Attribute für jede einzelne Zelle eines Blocks geholt und dann beim zweitenmal wird dieser Block wieder Zelle für Zelle an eine andere Stelle kopiert.

Das alles ist ziemlich langsam. Bei 200 Zeilen und 12 Spalten ist es gerade noch zufriedenstellend.
Außerdem habe ich das Problem, das wenn ich bei allen Zellen neue Attribute vergebe wiederrum alles langsamer wird.

Was kann ich tun? Kann mir bitte jemand weiterhelfen.
Gruß, Harry
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Leider hab ich da auch keine Erfahrung.
Aber nach einer Durchsicht der vorhandenen Methoden von wxGrid ist mir die Methode BeginBatch() und EndBatch() aufgefallen. Die unterdrückt ein ständiges Neuzeichnen des Grids bei vielen Attributänderungen.
Probiers doch mal. Vielleicht hilfts... :wink:
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Ich hab jetzt mal einen Test gemacht. In jede Zelle ein einem Grid von 1000x1000 Zelle mit SetCellValue() den Text "Hallo" zu schreiben dauert mit einfachen Schleifen unter 15sec. Das ist doch recht fix.

Gilt leider nur für die Value Zugriffe. Hintergrundfarbe ändern dauert deutlich länger. :roll: BeginBatch() bring da auch nix...
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo Christopy,

Richtig! Wenn ich nur die Values ändere geht es relativ schnell. Kommen aber die Attribute hinzu dauert es erheblich länger.
Abgesehen davon sind mir selbst 15 sec viel zu lange.
Es muss aber viel schneller gehen.
Ich will mein Programm jetzt hier zwar nicht mit Excel oder anderen bekannten Tabellenverarbeitungsprogrammen vergleichen - das wäre wohl etwas anmaßend - nur das es sehr, sehr viel schneller geht ist möglich und ich spreche hier von Millionen Zellen in Sekundenschnelle!
Dieses Prinzip würde mich interessieren. Wie kann man so viele Zellen so schnell mit all den Werten und Attributen kopieren, ändern ...? Könnte man so etwas auch mit wxPython programmieren?
Ich kann mir nicht vorstellen das dies mit for-Schleifen funktioniert. Es muss irgendwie anders gehen.
Gruß, Harry
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
HarryH hat geschrieben:Ich will mein Programm jetzt hier zwar nicht mit Excel oder anderen bekannten Tabellenverarbeitungsprogrammen vergleichen - das wäre wohl etwas anmaßend - nur das es sehr, sehr viel schneller geht ist möglich und ich spreche hier von Millionen Zellen in Sekundenschnelle!
Dieses Prinzip würde mich interessieren.
Da werden die Daten nicht im eigentlichen Control gehalten, sondern bei Bedarf (sprich wenn sie im sichtbaren Bereich kommen) aus einer Datenstruktur gelesen. Ich hab' keine Ahnung von wxPython, aber ich sah eben, dass das wohl mittels wxLC_VIRTUAL geht. Dürfte aber einiges an Arbeit sein.

Jan
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Für sowas kann man eigene Klassen auf Basis von wxPyGridTableBase erstellen. Die übergibt man dem Grid mit SetTable(). Dort verwaltest Du selbst alle Inhalte des Grids. Schau Dir mal die Demodatei demo/GridHugeTable.py an. Dort wird ein kleines Beispiel gegeben, an dem man gut experimentieren kann. Ansonsten hier noch die Hilfe zu wxGrid.
Ob man damit auch schnell Attribute ändern kann ist allerdings die Frage.
Wenn Du nur alle Zellen ändern willst, kannst Du auf die SetDefaultCell...() Funktionen zurückgreifen. Z.B. um die Hintergrundfarbe aller Zellen zu ändern: SetDefaultCellBackgroundColour().[/url]
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

HarryH hat geschrieben:Hallo Christopy,
.....sehr viel schneller geht ist möglich und ich spreche hier von Millionen Zellen in Sekundenschnelle!
Aehm... Also excell schafft noch nicht mal mehr als 65535 Zeilen insgesamt, soweit ich weiss. Auch Openoffice hat bei Calc ein Limit. Ebenso Koffice.

Also Millionen von Zeilen ist unmöglich. Schön alleine wegen dem Speicherbedarf.
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo piddon,

Ich habe nicht Zeilen geschrieben, sondern Zellen! Wahrscheinlich hast du das übersehen.
Gruß, Harry
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

HarryH hat geschrieben:Hallo piddon,

Ich habe nicht Zeilen geschrieben, sondern Zellen! Wahrscheinlich hast du das übersehen.
Ohhh.. hmm ok... :) Sorry.. das i sah bei mir aus wie ein l beim schnellen lesen...
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Antworten