Seite 1 von 1
Tabelle auf Bildschirm ausgeben
Verfasst: Donnerstag 13. März 2008, 18:43
von sea-live
Servus
gibt es zur Ausgabe von Tabellen csvFiles in wx ein Modul
oder muss ich mir das selber Basteln
Ausgabe in eigenem FRAME auf den Bildschirm Formatiert und in FARBE wenn möglich
wäre super!!
Code: Alles auswählen
# Einlesen der daten csv )
file_in =open("test.csv", 'rb')
reader =csv.DictReader(file_in)
data = list(reader)
file_in.close()
Verfasst: Freitag 14. März 2008, 09:06
von Pumeluk2
Hallo,
da wäre wx.ListCtrl, allerdings kannst du damit nur Zeilen einfärben, keine einzelnen Zellen.
Falls du letzteres benötigst, schau dir mal wx.html.HtmlWindow an. Damit kannst du praktisch html-Frames erzeugen.
Infos dazu gibt es in der wxPython Demo.
Grüße,
Pumeluk2
Verfasst: Freitag 14. März 2008, 13:24
von gerold
Hallo!
Für anspruchsvollere Aufgaben gibt es noch das "Grid". Suche in der wxPython-Demo danach.
mfg
Gerold
Verfasst: Freitag 14. März 2008, 20:13
von sea-live
Danke das hat hingehauen !
Ich hab keine Methode gefunden die mir die Zeilennummerierung ausblendet geht das überhaupt
die liste DATA ist nach Datum Sortiert und das ist auch die von mir gewünschte Rheienfolge
DANKE nochmals!
Code: Alles auswählen
file_in =open("%s%s\\%s.csv"%(self.pfad,self.listenname,self.dateiname), 'rb')
data=list()
for line in file_in:
data.append(line[:-1])
file_in.close()
self.anzahlReihen=len(data)
self.anzahlSpalten=len(data[0].strip().split(","))
self.CreateGrid(self.anzahlReihen,self.anzahlSpalten)#, gridlib.Grid.SelectRows)
##self.EnableEditing(False)
# simple cell formatting
i=0
for we in data[0].strip().split(","):
self.SetColLabelValue(int(i),str(we))
i=i+1
self.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
reihe=1
while reihe < len(data):
spalte=0
for wert in data[reihe].strip().split(","):
self.SetCellValue(reihe, spalte,str(wert))
spalte=spalte+1
reihe=reihe+1
# attribute objects let you keep a set of formatting values
# in one spot, and reuse them if needed
attrc1 = gridlib.GridCellAttr()
attrc1.SetTextColour(wx.BLACK)
attrc1.SetBackgroundColour(wx.Colour(200,200,20))
attrc1.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
attrc2 = gridlib.GridCellAttr()
attrc2.SetTextColour(wx.BLACK)
attrc2.SetBackgroundColour(wx.GREEN)
attrc2.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
attrc3 = gridlib.GridCellAttr()
attrc3.SetTextColour(wx.BLACK)
attrc3.SetBackgroundColour(wx.RED)
attrc3.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
attrc4 = gridlib.GridCellAttr()
attrc4.SetTextColour(wx.BLACK)
attrc4.SetBackgroundColour(wx.CYAN)
attrc4.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
# you can set cell attributes for the whole row (or column)
self.SetColAttr(3, attrc3)
self.SetColAttr(2, attrc2)
self.SetColAttr(1, attrc1)
self.SetColAttr(4, attrc4)
Verfasst: Freitag 14. März 2008, 22:36
von EyDu
Es seinen mir noch einige Anmerkungen zu deinem Code erluabt
:
Schau dir mal im Modul "os" die Funktion "path" an, um Pfade zusammenzustellen. (Edit: natürlich os.path.join)
Die erste for-Schleife kannst du etwas kompakter schreiben:
Nach PEP8 gehören vor und nach einem Gleichheitszeichen jeweils ein Leerzeichen. Auch werden Wörter in Variablennamen mit einem Unterstrich getrennt: ich_bin_ein_variablenname.
Die Schleife
Code: Alles auswählen
i=0
for we in data[0].strip().split(","):
self.SetColLabelValue(int(i),str(we))
i=i+1
kannst du vereinfachen in:
Code: Alles auswählen
for i, we in enumerate(data[0].strip().split(",")):
self.SetColLabelValue(int(i),str(we))
Und
Code: Alles auswählen
reihe=1
while reihe < len(data):
spalte=0
for wert in data[reihe].strip().split(","):
self.SetCellValue(reihe, spalte,str(wert))
spalte=spalte+1
reihe=reihe+1
kannst du auch schreiben als:
Code: Alles auswählen
for r, reihe in enumerate(data[1:])
for s, wert in enumerate(reihe.strip().split(",")):
self.SetCellValue(r+1, s, str(wert))
Und der letze Abschnitt geht natürlich noch viel kürzer:
Code: Alles auswählen
for index, color in enumerate(wx.RED, wx.GREEN, wx.Colour(200,200,20), wx-CYAN):
attr = gridlib.GridCellAttr()
attr.SetTextColour(wx.BLACK)
attr.SetBackgroundColour(color)
attr.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
self.SetColAttr(index+1, attr)
Verfasst: Samstag 15. März 2008, 08:06
von BlackJack
Anstelle des ``line[:-1]`` würde ich eher mit der `strip()`- oder `rstrip()`-Methode arbeiten.
Verfasst: Samstag 15. März 2008, 13:01
von EyDu
Stimmt, in Verbindung mit "map" sieht es dann gleich lesbarer aus.
Alternativ würde sich dann aber auch wohl gleich das "csv"-Modul anbieten.
Verfasst: Samstag 15. März 2008, 13:42
von sea-live
EYDU Danke für die Codeverbesserungen!
Frage war kann ich die Nummerierung der Tabelle entfernen?
Verfasst: Samstag 15. März 2008, 14:08
von EyDu
Die Lösung findet man doch in der Demo zu wxPython: Beispiel Grid, "wx.Grid using a custom Table, with non-string data".
Was du suchst ist die Methode "SetRowLabelSize" auf einem Grid:
.
Verfasst: Samstag 15. März 2008, 18:27
von sea-live
DAnke EyDu
die Doku ist nicht gerade UserFreundlich keine erklärung zu den Methoden nur Syntax
zu ***os.path.join***
gibts nur was bei WIKI nix in der Docu
wer suchet der findet
bis dann !
DANKE
Code: Alles auswählen
file_in =open("%s%s\\%s.csv"%(self.pfad,self.listenname,self.dateiname), 'rb')
data=list()
data = [line[:-1] for line in file_in]
file_in.close()
self.anzahlReihen=len(data) - 1 #data 0 enthält überschriften
self.anzahlSpalten=len(data[0].strip().split(","))
self.CreateGrid(self.anzahlReihen,self.anzahlSpalten)#, gridlib.Grid.SelectRows)
##self.EnableEditing(False)
for i, we in enumerate(data[0].strip().split(",")):
self.SetColLabelValue(int(i),str(we))
self.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
self.SetDefaultCellFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
self.SetDefaultCellTextColour(wx.BLACK)
for r, reihe in enumerate(data[1:]):
for s, wert in enumerate(reihe.strip().split(",")):
self.SetCellValue(r, s,str(wert))
self.SetReadOnly(r,s,True)
farben = (wx.Colour(200,200,20), wx.GREEN,wx.RED, wx.CYAN)
for index, color in enumerate(farben):
attr = gridlib.GridCellAttr()
attr.SetTextColour(wx.BLACK)
attr.SetBackgroundColour(color)
attr.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))
self.SetColAttr(index+1, attr)
#self.AutoSize()
self.SetRowLabelSize(0)
Verfasst: Samstag 15. März 2008, 19:08
von BlackJack
Von welcher Doku redest Du hier? Zu `os.path.join()` steht da doch etwas drin:
http://docs.python.org/lib/module-os.path.html
Verfasst: Sonntag 16. März 2008, 08:53
von sea-live
Danke ich hatte in der wx Docu gesucht
Verfasst: Sonntag 16. März 2008, 10:13
von gerold
sea-live hat geschrieben:die Doku ist nicht gerade UserFreundlich keine erklärung zu den Methoden nur Syntax
Hallo sea-live!
Erklärungen zu WX-Objekten und Methoden findest du direkt in der WX-Hilfe und nicht in der von wxPython.
http://wxwidgets.org/manuals/stable/wx_contents.html
Besonders interessant ist der Punkt "Alphabetical class reference".
mfg
Gerold
initialisierung der tabelle schlägt fehl
Verfasst: Samstag 26. April 2008, 10:22
von sea-live
Servus warum schlägt diese initialisierung fehl
aufruf via Frame Classe
Code: Alles auswählen
class TabelleFrame(wx.Frame):
def __init__(self,pfad,listenname,dateiname
,parent = None, id = -1,title="Daten zu Chart ",size = wx.Size(640,480)
):
self.pfad=pfad
self.listenname=listenname
self.dateiname=dateiname
wx.Frame.__init__(self, parent, id, title, size = size)
self.Bind(wx.EVT_CLOSE, self.on_close)
self.grid = Tabelle(self,self.pfad,self.listenname,self.dateiname)
eigentliche Tabelle
Code: Alles auswählen
class Tabelle(gridlib.Grid): ##, mixins.GridAutoEditMixin):
def __init__(self,pfad,listenname,dateiname, parent):
gridlib.Grid.__init__(parent, -1)
##mixins.GridAutoEditMixin.__init__(self)
#self.log = log
self.moveTo = None
self.pfad=pfad
self.listenname=listenname
self.dateiname=dateiname
Verfasst: Samstag 26. April 2008, 10:26
von EyDu
Was schlägt denn fehl? Gibt es eine Fehlermeldung und wenn ja, welche?
Re: initialisierung der tabelle schlägt fehl
Verfasst: Samstag 26. April 2008, 10:33
von gerold
sea-live hat geschrieben:Code: Alles auswählen
class Tabelle(gridlib.Grid): ##, mixins.GridAutoEditMixin):
def __init__(self,pfad,listenname,dateiname, parent):
gridlib.Grid.__init__(parent, -1)
Hallo sea-live!
So etwas nenne ich ein Durcheinander.
Die __init__-Methode eines Widgets sollte immer mit ``self`` und mit ``parent`` beginnen. Und genau so gibt man es auch weiter. Und ich kann mir nicht vorstellen, dass dieses "gridlib.Grid" anders arbeitet, auch wenn ich es nicht kenne.
Code: Alles auswählen
def __init__(self, parent, pfad, listenname, dateiname):
gridlib.Grid.__init__(self, parent)
mfg
Gerold
Verfasst: Samstag 26. April 2008, 10:33
von sea-live
EyDu hat geschrieben:Was schlägt denn fehl? Gibt es eine Fehlermeldung und wenn ja, welche?
Danke erst mal für die schnelle antwort
Fehlermeldung
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Python25\Meine_Programme\boerse_datum_test.py", line 248, in Tabelle_einblenden
self.tabelle_fenster = TabelleFrame(self.pfad,self.listenname,self.dateiname)
File "C:\Python25\Meine_Programme\boerse_datum_test.py", line 83, in __init__
self.grid = Tabelle(self,self.pfad,self.listenname,self.dateiname)
File "C:\Python25\Meine_Programme\boerse_datum_test.py", line 34, in __init__
gridlib.Grid.__init__(self,parent, -1)
File "C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\grid.py", line 1160, in __init__
_grid.Grid_swiginit(self,_grid.new_Grid(*args, **kwargs))
TypeError: in method 'new_Grid', expected argument 1 of type 'wxWindow *'
Verfasst: Samstag 26. April 2008, 12:09
von martin101986
Hallo sea-live,
dein Grid benötigt ein Fenster dass deine Tabelle beinhaltet. Der Fehler ist folgender dass du beim anlegen der Instanz der Klasse Tabelle kein parent mitgibst.
Hier gibst du beim Konstruktor als letzes Argument das parent an
Code: Alles auswählen
class Tabelle(gridlib.Grid): ##, mixins.GridAutoEditMixin):
def __init__(self,pfad,listenname,dateiname, parent):
gridlib.Grid.__init__(self, parent, -1)
In deiner Frame Klasse fehlt allerdings dann beim instanzieren der Tabelle das parent-Argument:
Code: Alles auswählen
#falsch
self.grid = Tabelle(self,self.pfad,self.listenname,self.dateiname)
#richtig:
self.grid = Tabelle(self,self.pfad,self.listenname,self.dateiname, parent = self)
Beachte Gerolds Eintrag zuvor wo er beschrieben hat wie eine __init__ Methode eines Widget aufgebaut sein sollte.
Grüße Martin
Verfasst: Samstag 26. April 2008, 16:50
von sea-live
neue Fehlermeldung
Code: Alles auswählen
TypeError: __init__() got multiple values for keyword argument 'parent'
zum zeitpunkt des aufrufes sind 3x wx.Frame offen
wie kann ich diese identifizieren