Tabelle auf Bildschirm ausgeben

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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()
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Für anspruchsvollere Aufgaben gibt es noch das "Grid". Suche in der wxPython-Demo danach.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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)
 
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:

Code: Alles auswählen

data = [line[:-1] for line in file_in]
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)
Zuletzt geändert von EyDu am Samstag 15. März 2008, 18:37, insgesamt 2-mal geändert.
BlackJack

Anstelle des ``line[:-1]`` würde ich eher mit der `strip()`- oder `rstrip()`-Methode arbeiten.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Stimmt, in Verbindung mit "map" sieht es dann gleich lesbarer aus.

Alternativ würde sich dann aber auch wohl gleich das "csv"-Modul anbieten.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

EYDU Danke für die Codeverbesserungen!

Frage war kann ich die Nummerierung der Tabelle entfernen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:

Code: Alles auswählen

grid.SetRowLabelSize(0)
.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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)
   
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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Danke ich hatte in der wx Docu gesucht
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Was schlägt denn fehl? Gibt es eine Fehlermeldung und wenn ja, welche?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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 *'
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Antworten