Seite 1 von 1

Datei erstellen und mit "Speichern unter" -Dialog speichern

Verfasst: Montag 6. Mai 2019, 14:21
von El_Capitan
Hey,

ich möchte eine txt.-Datei erzeugen und diese mit einem "Speichern unter" -Dialog abspeichern. Folgender Code erzeugt ein Fenster mit einem "Speichern"-Button, der den "Speichern unter" -Dialog öffnet, wenn ich ihn anklicke:

Code: Alles auswählen

from Tkinter import * 
import tkFileDialog 

def save_it():
    Init_Name='Standard.txt'
    file = tkFileDialog.asksaveasfilename(filetypes=[('txt-files','.txt')],
                                          initialfile=Init_Name)
            
root = Tk()
Button(text="Speichern", command=save_it).pack() 
root.mainloop() 
Wie kann ich jetzt eine txt.Datei erstellen die über diesen Dialog abgespeichert wird?

MfG

Re: Datei erstellen und mit "Speichern unter" -Dialog speichern

Verfasst: Montag 6. Mai 2019, 17:36
von __blackjack__
@El_Capitan: In dem Du testest ob `file` (was besser `filename` heissen sollte) etwas enthält/nicht `None` ist, denn der Benutzer kann den Dateidialog auch abbrechen, und falls es einen Dateinamen gibt, öffnest Du eine Textdatei, schreibst da etwas hinein, und schliesst sie wieder.

Als erstes solltest Du aber auf Python 3 umsteigen, dann keine Sternchen-Importe machen, und auf Modulebene keine Variablen definieren.

Edit:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from tkinter.filedialog import asksaveasfilename


def save_it():
    filename = asksaveasfilename(
        filetypes=[('txt-files', '.txt')], initialfile='Standard.txt'
    )
    if filename:
        with open(filename, 'w', encoding='utf-8') as file:
            file.write('Hallo, Welt.\n')


def main():
    root = tk.Tk()
    tk.Button(root, text='Speichern', command=save_it).pack() 
    root.mainloop() 


if __name__ == '__main__':
    main()
Hier wird jetzt hoffentlich klar warum `file` kein guter Name für den `filename` war. Und Du hattest beim `Button`-erstellen vergessen das Elternwidget anzugeben.

Re: Datei erstellen und mit "Speichern unter" -Dialog speichern

Verfasst: Montag 6. Mai 2019, 18:41
von bb1898
Wenn Du allerdings den Text für Deine Datei nicht fest in der Funktion save_it() stehen haben willst, wird es schwieriger. Dann entsteht das Problem, dass Du dem command eines Buttons nicht ohne weiteres Parameter mitgeben kannst. Da kannst Du dreierlei machen:

- Eine globale Variable für den Text nehmen. Nicht gut, bestimmt nicht mehr, so bald das Programm weniger winzig bleibt.

- functools.partial benutzen. Würde ich für so ein kleines Testprogramm durchaus in Erwägung ziehen.

- Eine Klasse für das Fenster anlegen, z.B. abgeleitet von Tkinter.Frame, und darin auch ein Attribut für den Dateiinhalt. Der muss (und sollte) deshalb noch nicht innerhalb dieser Klasse erzeugt werden. Das wäre der für GUIs normale und ausbaufähige Weg.