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?
Kurze Frage
- 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
assert encoding_kapiert
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)
- 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.
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
assert encoding_kapiert
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?
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?
@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.
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.
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?
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?
@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
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
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.
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.
[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]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
[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]
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
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.
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..
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.
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.
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.
geht das auch ohne erst mal draufzuklicken?
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()