Hilfe: Datei speichern und lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JensP-Anfaenger

Freitag 15. April 2005, 12:06

Hallo, ich hoffe, ich gehe hier mit meiner 'Unwissenheit' keinem auf den Geist!

Ich studiere Maschinenbau und beginne gerade mit meiner Diplomarbeit und habe ien paar Probleme mit Python!

Ich wollte mit WX eine GUI zusammenbasteln, in die einige Eintraege geschrieben werden und dann gespeichert und wieder ausgelesen werden.

Wenn jemand von Euch mir helfen könnte, wäre ich echt dankbar.

Ich würde mich z.B. sehr über ein Beispielprog freuen, indem z.B. die Eintraege aus einer wx-Tabelle und zwei weitere Eintraege aus einfachen Eingabefeldern gespeichert werden und dann wieder ausgelesen werden.

Vielleicht gibt es hier ja sogar so nette Menschen, an die ich mich evtl. telefonisch bei weiteren 'dummen' Fragen wenden könnte!

Vielen Dank!

Jens
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. April 2005, 12:52

JensP-Anfaenger hat geschrieben:Ich würde mich z.B. sehr über ein Beispielprog freuen, indem z.B. die Eintraege aus einer wx-Tabelle und zwei weitere Eintraege aus einfachen Eingabefeldern gespeichert werden und dann wieder ausgelesen werden.
Ich nutze kein wx mehr, also kann ich dir kein direktes Beispiel geben, aber ich kann dir mal einen Vorschlag für das Grundgerüst machen:
Du baust eine Datenstruktur zusammen (ein dict würde sich anbieten), wo diese Werte gespeichert werden. Diese Struktur kannst du dann mit pickle auf die Platte speichern und auch wieder auslesen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
JensP-Anfaenger

Freitag 15. April 2005, 13:13

Ich habe versucht, es mit einem dict zu machen:

Code: Alles auswählen

a={}
a["ersterEintrag"]='ErsterWert'
.
.
.
file=open(filename,"w")
pickle.dump(a,f)
Zum Auslesen:

Code: Alles auswählen

file=open(filename,"w")
pickle.load(f)
variable=a["ersterEintrag"]
Funktioniert irgendwie nicht!
Warum?
raist1314
User
Beiträge: 52
Registriert: Dienstag 21. September 2004, 06:58
Wohnort: Adelzhausen
Kontaktdaten:

Freitag 15. April 2005, 13:18

Leonidas hat geschrieben: Ich nutze kein wx mehr
Warum nutzt Du kein wx mehr und was benutzt Du stattdessen?

Sebastian
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. April 2005, 14:46

JensP-Anfaenger hat geschrieben:

Code: Alles auswählen

a={}
a["ersterEintrag"]='ErsterWert'
file=open(filename,"w")
pickle.dump(a,f)
Zum Auslesen:

Code: Alles auswählen

file=open(filename,"w")
pickle.load(f)
variable=a["ersterEintrag"]
Funktioniert irgendwie nicht!
Warum?
Erstens: du solltest eine Variable nicht file nennen, die überschreibt dann das builtin file() (das zum öffnen von Dateien ist). Zweitens: Wie kann pickle etwas in stream f dumpen und auslesen, wenn es diesen Stream nicht gibt? Du hast ihn file genannt...
raist1314 hat geschrieben:
Leonidas hat geschrieben:Ich nutze kein wx mehr
Warum nutzt Du kein wx mehr und was benutzt Du stattdessen?
Ich nutze, so seltsam es auch scheint, auch unter Windows GTK+/PyGTK. Hat mehrere Gründe: läuft auf allen für mich relevanten Platformen (wx auch), ist recht schnell (wx auch), hat eine gute Referenz (wx nicht), hat tolle Doku (wx nicht), läuft stabil (wx nicht immer), programmiert sich einfach und unkompliziert - mehr pythonic als wx. Somit steht mir GTK beim programmieren seltener im Weg als wx, so dass ich mich auf die Programmlogik konzentrieren kann, statt zu überlegen, warum es in wxPython mehrere Wege gibt estwas zu erreichen, warum diese alle buggy sind und warum die gefixten Versionen erst in einem halben Jahr released werden.

Bin grad dabei, ich Demo App zu schreiben, mit gtk und pickle, ok? Geduldet euch noch ein wenig, bin bald fertig :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 15. April 2005, 15:14

Okay, hier das Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

import gtk, pickle

class SomeWindow(object):
    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title("Demo Save")
        self.window.set_default_size(330, 220)
        self.window.connect("delete_event", self.delete_event) 
        
        self.box = gtk.Table()
        
        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        
        self.model = gtk.ListStore(str)
        self.treeview = gtk.TreeView(self.model) 
        self.treeview.columns_autosize()
        sw.add(self.treeview)
        
        
        renderer = gtk.CellRendererText()
        column = gtk.TreeViewColumn("A column", renderer, text=0)
        renderer.connect('edited', self.edited)
        renderer.set_property('editable', True)
        self.treeview.append_column(column)
        
        for st in range(3):
            self.model.append(['Just some text'])
        
        self.t1 = gtk.Entry()
        self.t2 = gtk.Entry()
        
        self.box.attach(sw, 0, 1, 0, 2)
        self.box.attach(self.t1, 1, 2, 0, 1)
        self.box.attach(self.t2, 1, 2, 1, 2)
        self.box.set_row_spacings(5)
        self.box.set_col_spacings(5)
        self.window.add(self.box)
        
        self.window.show_all()
        self.load()
    
    def delete_event(self, widget, event, data=None):
        self.save()
        gtk.main_quit()
        return False
    
    def edited(self, cell, row, text):
        iterator = self.model.get_iter_from_string(row)
        self.model.set_value(iterator, 0, text)
    
    def save(self):
        struct = {}
        struct["t1"] = self.t1.get_text()
        struct["t2"] = self.t2.get_text()
        struct["list"] = []
        for row in self.model:
            struct["list"].append(row[0])
            
        f = file('savedemo.pickle', 'w')
        pickle.dump(struct, f)
        f.close()
    
    def load(self):
        try:
            f = file('savedemo.pickle', 'r')
            struct = pickle.load(f)
            f.close()
        except IOError:
            # File not found
            struct = {'t1' : '4004',
            't2' : 'P1',
            'list' : ['Python', 'Haskell', 'Ruby']}
        
        # populate
        self.t1.set_text(struct["t1"])
        self.t2.set_text(struct["t2"])
        for seq, val in enumerate(struct["list"]):
            iterator = self.model.get_iter(seq)
            self.model.set_value(iterator, 0, val)
            #self.model.append([val])

def main():
    sw = SomeWindow()
    gtk.main()

if __name__ == '__main__':
    main()
Erst werden die Widgets erstellt, dann füllt load() sie mit Werten. Danach kann man im Fenster die Werte verändern, sowohl in den Eingabefeldern als auch in der Liste. Beim schließen wird in save() alles in ein Dictionary gespeichert (die Struktur ist in load() vorgegeben) und alles wird in ein Picklefile gespeichert. Beim nächsten öffnen werden, wenn das Picklefile vorhanden ist, die Daten gelesen, wenn nicht dann Defaultwerte gesetzt und die Widgets gefüllt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
JensP-Anfaenger

Freitag 15. April 2005, 18:51

Vielen Dank für deine Mühe!

Ich werde, sobald ich GTK+ installiert habe
(scheint nicht so einfach unter WinXP),
es ausprobieren!

Gibt es für GTK+ auch so etwas wie den BOA-Construktor?

Danke!

Jens
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 15. April 2005, 19:54

Hallo Jens!
JensP-Anfaenger hat geschrieben: Ich werde, sobald ich GTK+ installiert habe
(scheint nicht so einfach unter WinXP), es ausprobieren!
Hier findest du ein paar Links, die dich vielleicht weiter bringen:
http://python.sandtner.org/viewtopic.php?p=17098#17098
JensP-Anfaenger hat geschrieben: Gibt es für GTK+ auch so etwas wie den BOA-Construktor?
Falls du damit so etwas meinst wie Formulare gestalten die du dann mit Python programmieren kannst --> Glade.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 16. April 2005, 07:59

Ich habe die Wikie-Seite über PyGTK erweitert, dort wirst du bald noch mehr zu PyGTK finden können.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten