Kurze Frage

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
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

ich habe zum speichern der projekte meines Programms nun textdateien verwendet..
das Produzierte wird in einer textdatei dokumentiert und kann so wiederhergestellt werden. Diese "Sicherungsdatei" wird immer im Projektordner erstellt, und wenn
der Benutzer das Projekt speichern will, kann mit tkFileDialog eine "Sichern unter" Fenster aufgerufen werden, welches eine Textdatei an dem ausgewählten ort erstellt wird.
Mit dem shutil Modul kann ich dann durch die funktion copyfileobj den Inhalt der einen Datei in die andere schreiben. Aber wenn man ein weiteres mal speichert merkt man, dass die Funktion den gesammten Text nicht wieder ersetzt sondern hinzufügt. Wie kann ich das lösen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kurze Antwort: Ohne kleinen lauffähigen Code-Snippet können wir Dir da kaum helfen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

Das sind die wichtigen funktionen dafür:

Code: Alles auswählen

def pre_save(Projektname,Autor,app):
        app.sdatei = open('sicherungsdatei.txt','w')
        app.sdatei.write(Projektname + "\n")
        app.sdatei.write(Autor + "\n")
        app.saved = False
        app.sdatei.close()

 
#Funktion um das Projekt zu sichern        
def save_project(app):
    if (app.save_file == None):
        save_at_project(app)
    else:
        
        app.sdatei = open('sicherungsdatei.txt','r')
        shutil.copyfileobj(app.sdatei,app.save_file)
        app.sdatei.close()
        app.save_file.close()
              
#speichern unter funktion
def save_at_project(app):
    file_opt = options = {}
    options['defaultextension'] = '' # couldn't figure out how this works
    options['filetypes'] = [('text files', '.txt')]
    options['initialdir'] = 'C:\\'
    options['initialfile'] = 'meinlied.txt'
    options['parent'] = root
    options['title'] = 'Sichern Unter'
    app.save_file = tkFileDialog.asksaveasfile(mode='w', **file_opt)
    save_project(app)
    
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ist kein Minimalbeispiel und vor allem nicht lauffähig. Generell fällt auf, dass Du das `with`-Statement für das Öffnen von Dateien nicht verwendest - das solltest Du aber. Zudem würde ich für Dein Format mal die Benutzung eines Dtandards (JSON, INI, YAML, XML) vorschlagen.

Was ich nicht kapiere: Wieso benutzt Du `shutil.copyfileobj` anstelle von `shutil.copyfile` - damit würdest Du Dir das manuelle Öffnen von Dateien sparen.

Den beschriebenen Fehler kann ich so nicht nachvollziehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

Das verstehe ich leider nicht mit dem with Statement. Und von Dtandards hab ich auch noch nichts gehört.
ich benutze das, weil ich von tkfiledialog ja schon so eine speichern unter funktion habe, wo man pfad auswählen kann und einen eigenen Namen eingeben kann. Jedoch erstellt es dann direkt selber di datei und gibt mir nicht den pfad und den eingegebenen namen zurück. Außerdem dachte ich, dass beim kopieren einer datei der Name gleichbleibt, also immer "Sicherungsdatei".

Ich könnte den Inhalt vllt einfach immer löschen bevor ich ihn wieder reinkopiere. Aber bis jetzt hab ich nur die Methode gefunden, dass man eine zeile nach der anderen durchgeht mit einer forschleife und dann mit line.strip() hald löschen. Gibts da was einfacheres den gesammten Inhalt zu löschen?
BlackJack

@questlove: „Dtandards” war ja wohl ziemlich offensichtlich ein kleiner Tippfehler. Schau doch mal welche Taste links neben dem „D” liegt. ;-)

Die ``with``-Anweisung wird in der Python-Dokumentation beschrieben und es gibt ein PEP dazu wo Motivation und Beispiele drin stehen.

Wenn Du einen Dateinamen statt eines Dateiobjekts von einem Speichern-Dialog haben möchtest, dann solltest Du mal schauen welche Funktionen es in `tkFileDialog` noch so gibt.

Eine Datei kann man mit `os.remove()` löschen. Und wenn man eine Datei im Schreibmodus öffnet, also 'w' oder 'wb', dann wird dadurch auch der Inhalt gelöscht.

Der Quelltext sieht teilweise etwas seltsam aus. Du hast da Funktionen die ein `app`-Objekt herum reichen und darauf Attribute setzen und abfragen. Das sieht aus, als wenn das eigentlich Methoden auf dem `app`-Objekt sein sollten.

Warum bindest Du das Wörterbuch in `save_at_project()` an zwei verschiedene Namen und befüllst es so umständlich anstatt das als ein literales Wörterbuch zu schreiben? Warum überhaupt der Umweg über ein Wörterbuch?

Die wechselseitige Rekursion zwischen `save_project()` und `save_at_project()` sieht auch irgendwie ungesund aus.
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

aber von JSON, INI, YAML, XML hab ich noch nie was gehört. Hab in der Schule ja erst seit nem guten halben Jahr Python gehabt. ;)
ja wollt ich auch aber ich hab in tkFileDialog nichts gefunden.. nur dass man nur eiinen pfad auswählen kann aber das wollt ich nicht. Ich wollte das das schon so aussieht wie das sichern unter.. ;)
Aber die Datei bleibt bestehen oder? sie ist hald dann nur leer?!
Ich weis. mir wurde hier schon sehr oft gesagt dass dier "Ordnung" , "Struktur" und "Art und Weise" sehr umstendlich, veraltet und seltsam ist. Aber ich kriegs zur zeit einfach nicht besser hin.. ;)
Ich weis nicht warum ich das so gemacht habe. ich habs so hald verstanden und bin selbst draufgekommen ;D

Was ich noch nicht finden konnte, war, wie ich Tasten befehle zuordnen kann. Also ich will, dass wenn "a" gedrückt wird die Note "A" geschrieben wird usw.. Wie gehtn das?
BlackJack

@questlove: Du wirst nicht alles was man benutzen kann und vielleicht auch sollte in der Schule lernen. Von den Formaten hast Du jetzt ja zumindest hier im Forum etwas gehört.

Es gibt in `tkFileDialog` eine Funktion die den Dateinamen statt eines Dateiobjektes liefert. Es ist ja nicht so dass es 100te von Funktionen in dem Modul gäbe, oder das die einen Namen hat der völlig irreführend wäre oder so…

Du hast einiges offensichtlich nicht verstanden wenn Du nicht weisst, warum Du etwas gemacht hast.

Die Frage mit den Tasten hat nichts mehr mit dem Dateiproblem zu tun und wäre ausserdem eine `Tkinter`-Frage. Man kann mit der `bind()`-Methode auf Tasten an Funktionen binden: http://effbot.org/tkinterbook/tkinter-e ... ndings.htm
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Hallo questlove,

du und deinesgleichen sind ein häufiger Gast in diesem Forum. Ihr habt eine Frage oder ein Problem und wir sollen euch helfen. Das tun wir gerne - sonst wären wir ja nicht hier. Aber leider, leider läuft es häufig mit euch häufig gleich ab. Ihr seid neu in der Sprache und experimentiert herum. Das ist toll! Aber ihr erwartet von uns zu viel oder habt eine falsche Vorstellung wie der Hase hier läuft. Manchmal sind es die Hilfe für Hausaufgaben, manchmal eure eigenen Projekte. Manche erwarten die Lösung auf dem Präsentierteller, manche haben abstruse Fragestellungen - manche beides.
Das ist alles ok. Wir waren früher bestimmt auch so. Aber - und jetzt kommts - ihr müsst bereit sein euch für die Sache zu engagieren. Ihr seid es nicht gewöhnt selber Sachen zu recherchieren oder zu erarbeiten (dank Frontalunterricht wird einem alles schön mit dem Trichter vermittelt) oder ihr seid dafür einfach schlicht zu faul. Und das ist der Punkt. So wie bei dir. Du weißt nicht, was das `with`-Statement ist? Es ist nicht lange her, da wusste ich es auch nicht. Aber ich kenne zum Beispiel `google`. Und da finde ich viele Erklärungen - sogar welche auf deutsch. Auch wieder so eine Sache. An Englisch kommt man nicht vorbei. Aber zurück zur Eigenleistung (auch Englisch ist eine Eigenleistung - glaub ja nicht, dass ich ab der Oberstufe wirklich in der Schule weiter Englisch gelehrnt habe). Wenn du nicht Bereit bist, eines von "JSON, INI, YAML, XML" in Google nachzurecherchieren dann ist das schwach und macht uns unglücklich. Wir wollen dir gerne helfen (wirklich!) aber wir sind keine Lehrer, die dir alles vorkauen. Weil das Schlimme ist, dass es immer so weiter geht, wenn wir nicht von euch fordern, dass ihr euch selbst eigenständig mit dem Thema beschäftigt. Dann fordert ihr weiter fertige Lösungen.
Wir wollen nur solche unterstützen, bei denen es auch Sinn macht. Und das sind die, die sich dann als nächstes das Tutorial antun und auch zum Beispiel PEP-8 durcharbeiten (siehe Signatur).

Also bitte tue dir und uns den Gefallen und beginne lernen zu lernen und versuche zunächst selbst deine Probleme zu lösen und erst dann komm zu uns und lass dir auf die Sprünge helfen.

Wenn du bereit für die rote Pille bist, dann quäl dich durch die Grundlagen. Falls du doch lieber die blaue willst, dann frage lieber deinen Lehrer.

Bild Bild
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

Ja ich verstehe euch. Aber du sagst ja selber, früher wart ihr genau so. Bei mir sind es einige Fragen, das stimmt. Das bedeutet aber nicht dass ich wegen jedem kleinen Problem hier nachfrage. Ich habe die bestimmt hälfte meiner Probleme auch selber gelöst, aber manchmal find ich einfach nicht das richtige. Ich benutze immer google bevor ich hier etwas frage. Es tut mir leid dass ich noch keine Fragen hier beantworten kann sondern nur frage, aber ich habe noch nie nach einer fertigen Lösung von euch gebittet. Natürlich versuch ich alles selber zu machen, aber manchmal kommt man ohne hilfe einfach nicht weiter. Wie bei den Tastaturbefehlen. Da habe ich auch gesucht, aber nur was von Eingaben gefunden und nicht, dass mit einem tastendruck ein befehl ausgeführt wird. Naja..Deshalb hab ich hald gefragt. Und ob ihr die Frage beantwortet liegt ja an euch. Ich kann bis jetzt noch wenig Hilfe geben weil ich ja auch noch in den "Grundlagen" bin. Aber jetzt schon mal danke für alle Antworten. :)
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

ach ja und das mit "JSON, INI, YAML, XML" stimmt. Ich hab schnell geantwortet, dass ich das nicht kenne,ohne in google zu suchen, aber ich hab ja nicht nach einer Erklärung gefragt. Da schau ich dann schon nach ;)

Update: Ach der Pfad ist im filename schon enthalten, jetz hab ichs kapiert. sry..
Zuletzt geändert von questlove am Sonntag 11. September 2011, 11:20, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tastatureingaben bezeichnet man auch als "Key Events". Wenn du nach diesem Stichwort suchst, müsstest du eigentlich fündig werden. Ein Key Event wird dann üblicherweise mit einer Callback-Funktion verknüpft, die den gewünschten "Befehl" ausführt.
questlove
User
Beiträge: 65
Registriert: Dienstag 15. Februar 2011, 16:11

Also bei der Tastatureingabe, wenn ich will dass bei "a" etwas geschieht, steht da, dass das nur geht wenn man davor auf das Fenster einmal geklickt hat.

Code: Alles auswählen

from Tkinter import *

root = Tk()

def key(event):
    print "pressed", repr(event.char)

def callback(event):
    frame.focus_set()
    print "clicked at", event.x, event.y

frame = Canvas(root, width=100, height=100)
frame.bind("<a>", key)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()
geht das auch ohne erst mal draufzuklicken?
Antworten