Datei erstellen und mit "Speichern unter" -Dialog speichern

Fragen zu Tkinter.
Antworten
El_Capitan
User
Beiträge: 5
Registriert: Dienstag 8. Januar 2019, 15:36

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
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

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.
Antworten