Wie Text aus Eingabefeld in .txt-Datei speichern?

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
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Hi Allerseits,

Ich habe ein kleines Tool, welches zwei Text Felder hat.

Im ersten Feld soll der eingegebene Text in eine .txt-Datei gespeichert werden.

Im zweiten Feld, wird per Button der Text in das Eingabefeld aus einer Datei geladen.

Bisher funktioniert leider aber nur die Variante wo der Text aus einer Datei gelesen wird und im Eingabefeld landet

Den Text in eine Datei zu speichern bekomme ich irgendwie nicht hin. Ich habe auch schon viele, viele Stunden gegoogelt und in Bücher geschaut...ohne Erfolg.

Hier mein Code:

Code: Alles auswählen

import PySimpleGUI as sg
# this one long import has the effect of making the code more compact as there is no 'sg.' prefix required for Elements
from PySimpleGUI import InputCombo, Combo, Multiline, ML, MLine, Checkbox, CB, Check, Button, B, Btn, ButtonMenu, Canvas, Column, Col, Combo, Frame, Graph, Image, InputText, Input, In, Listbox, LBox,  Menu, Multiline, ML, MLine, OptionMenu, Output, Pane, ProgressBar,  Radio, Slider, Spin, StatusBar, Tab, TabGroup, Table, Text, Txt, T, Tree, TreeData,  VerticalSeparator, Window, Sizer

import os

from pathlib import Path


col1 = Column([[Frame('Input Text to .txt-File:', [[Column([[Multiline( key='SAVE', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))

col2 = Column([[Frame('Load .txt-File Content:', [[Column([[Multiline( key='LOAD', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))



layout = [

        [col1, col2],
        [sg.Button("SAVE DRAFT"),sg.Button("LOAD DRAFT"), sg.Exit()],
                ]

window = sg.Window("Input output Tool", layout, element_justification="right")

def save_draft ():

    window['SAVE'].read()
    txt1 = Path('txt1.txt').write_text()
    txt1 = txt1.replace('\n', '')



def load_draft ():
    txt1 = Path('txt1.txt').read_text()
    txt1 = txt1.replace('\n', '')
    window['LOAD'].update(txt1)


def main ():

    while True:
        event, values = window.read()


        if event == sg.WIN_CLOSED or event == "Exit":
            break


        if event == "SAVE DRAFT":
            save_draft ()


        elif event == "LOAD DRAFT":
            load_draft ()



    window.close()


if __name__ == "__main__":
    main()

Wenn ich auf "SAVE DRAFT" klicke, erscheint folgende Fehlermeldung:

AttributeError: 'Multiline' object has no attribute 'read'

Alternativ habe ich folgende Varianten für die Funktion "save_draft" ausprobiert, mit anderen folgenden Fehlern:

2. Variante

Code: Alles auswählen

    filename = "txt1.txt"
    window['MONTAG'].read_text
    with open(filename, 'w') as f:
        text = f.write()
        f.write(filename)
Fehlermeldung:
window['MONTAG'].read_text
AttributeError: 'ErrorElement' object has no attribute 'read_text'



3. Variante

Code: Alles auswählen

    window['MONTAG'].read()
    with open("txt1.txt",'w') as f:
    #f.write("my first file\n")
        f.write.update(f)
        f.close()
Fehlermeldung:
window['MONTAG'].read()
AttributeError: 'ErrorElement' object has no attribute 'read'




4. Variante

Code: Alles auswählen

        input_text = values['MONTAG']
        text_file = open("txt1.txt", "w")
        text_file.write(input_text)
        text_file.close()  
Fehlermeldung:
input_text = values['MONTAG']
NameError: name 'values' is not defined


5. Variante

Code: Alles auswählen

    MONTAG = key='MONTAG'
    txt1 = Path('txt1.txt').write_text(MONTAG)
    txt1 = txt1.write('\n', '')
    window['MONTAG'].update(txt1)
    file1.close()
Fehlermeldung:
txt1 = txt1.write('\n', '')
AttributeError: 'int' object has no attribute 'write'




6. Variante

Code: Alles auswählen

    MONTAG = input()
    text_file = open("txt1.txt", "w")
    text_file.write(MONTAG)
    text_file.close()
Ergebnis:
Hier stürzt das Programm ab, aber speichert den Wert "MONTAG" in die Datei.
Was aber nichts mit dem Eingabefeld zu tun hat. Hilft also auch nicht....

Ich würde mich sehr über eure Hilfe freuen! Wo liegt der Fehler, wie muss der Code aussehen? :?: :?: :?:

Liebe Grüße,
Marlon
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze keine globalen Variablen. Schreibe richtige Funktionen, die alles was sie brauchen, über ihre Argumente bekommen.
Ich sehe nirgendwo, dass du MONTAG definiert hättest.
In `save_draft` benutzt Du write_text, ohne Argument. Was soll da also geschrieben werden?
Was soll die 1 bei txt1? Klemmt die e-Taste bei Dir?
Bei all Deiben Varianten Rätsel Du Code, ohne auf die Fehlermeldung einzugehen, um daran zu lernen, warum es nicht funktioniert.
Alle Eingaben stehen in `values`.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marlon_germany: Das sieht jetzt extrem nach blind rumprobieren aus. So funktioniert programmieren nicht. Alle Varianten wo `MONTAG`/"MONTAG" drin vorkommen können ja ganz offensichtlich nicht funktionieren. Was hast Du Dir dabei denn überhaupt gedacht? Wo kommt *das* denn bitte her?

Bei dem Code würde ich als erstes auch folgende zwei Anmerkungen los werden wollen:

1. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

2. Funktionen (und Methoden) bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben.

Die gehören gewissermassen zusammen, denn aus dem ersten folgt letztlich das zweite.

Und ich denke das hat auch in gewisser Weise mit dem aktuellen Problem zu tun, denn wenn ”Funktionen” einfach auf magische Weise immer auf alles mögliche zugreifen, ohne dass das sauber übergeben wird, machen viele Anfänger sich scheinbar auch weniger Gedanken wie das Programm *genau* abläuft, also Schritt für Schritt, welcher Name an welchen Wert mit welchem Zustand gebunden wird, welche Typen die Werte haben, und daraus folgend welche Operationen (Operatoren und Methoden) die haben. Und alles sieht irgendie nach Magie aus, wo man das richtige Zauberwort oder die richtige Reihenfolge irgendwie raten kann oder gar muss. Muss man nicht, und kann man in der Regel auch nicht.

Du musst Dir klar machen was der Code in dem Programm und der der `save_draft()`-Funktion bedeutet, was jeder Teilausdruck macht und als Ergebnis (Wert und Typ) hat. Bei den ganzen Varianten ist sogar mal die richtige erste Operation dabei, und das kann man sogar an den Fehlermeldungen sehen welche das ist, weil da der richtige Datentyp erwähnt wird, auf dem im nächsten Schritt dann aber eine falsche Operation versucht wird anzuwenden. Wo man sich dann fragen sollte warum Du denkst, das es dort eine `read()`-Methode geben sollte. Welcher Teil in der Dokumentation zu dem Datentyp hat Dich zu dieser Annahme verleitet? Der Datentyp hat nicht mal *irgendeine* Methode die mit dem Buchstaben "r" anfängt. Also sind auch andere Varianten mit `read*` nur geraten.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Hallo nochmal,

Es funktioniert nun. Danke für die Denk-Hinweise, die Anstöße Umzudenken und das Programm in die main() Funktion zu packen. Folgende geänderte Funktion läuft nun, seitdem sie innerhalb der main() Funktion steht:

Code: Alles auswählen

    def save_draft ():

        input_text = values['MONTAG']
        filename = "txt1.txt"
        with open(filename, 'w') as f:
            text = f.write(input_text)
PS: und die `read()`-Methode hatte ich irgendwann aus verzweiflung probiert, da ich dachte, dass die Daten aus dem Input-Feld mit 'read' erst 'gelesen' werden müssen (somit im Zwischenspeicher liegen) um dann mit 'write' in die Datei geschrieben zu werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marlon_germany: Die Funktion sollte aber nicht in einer anderen Funktion definiert werden sondern auf Modulebene. Du hast 2. nicht umgesetzt: Funktionen bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben und greifen da nicht einfach so magisch drauf zu. `save_draft()` benötigt `values` oder gleich den `input_text` als Argument.

Was hat denn `text` am Ende als Wert? Der Name passt da nicht zu. Und verwendet wird er auch nirgends.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung mit angeben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Bei meinem letzten Post hatte ich geschrieben, dass das Programm mit folgender Zeile funktioniert:

Code: Alles auswählen

def save_draft ():

        input_text = values['MONTAG']
        filename = "txt1.txt"
        with open(filename, 'w') as f:
            text = f.write(input_text)
Das Argument 'MONTAG' (was falsch ist) hatte ich an dem Zeitpunkt bereits mit 'SAVE' ersetzt, aber übersehen hier richtig reinzuschreiben.

Ich habe nun die beiden Funktionen save_draft() und load_draft() wieder aus der main()-Funktion herausgenommen.
Solange ich aber die save_draft() Funktion unverändert am neuen Platz außerhalb der main-Funktion lasse, kommt beim Versuch Text zu speichern die Fehlermeldung:
Traceback (most recent call last):
File "C:\Users\-\Desktop\TEST_FINAL.py", line 70, in <module>
main()
File "C:\Users\-\Desktop\TEST_FINAL.py", line 56, in main
save_draft ()
File "C:\Users\-\Desktop\TEST_FINAL.py", line 13, in save_draft
input_text = values['SAVE']
NameError: name 'values' is not defined
...also habe ich bei der save_draft() Funktion folgende Code-Zeile hinzugefügt: event, values = window.read().
Dann funktioniert das speichern zwar wieder, aber dafür muss ich 2x auf "LOAD DRAFT" klicken, damit der zuvor gespeicherte Text in das Feld geladen wird.

Der aktuelle Script-Code sieht wie folgt aus:

Code: Alles auswählen

import PySimpleGUI as sg
# this one long import has the effect of making the code more compact as there is no 'sg.' prefix required for Elements
from PySimpleGUI import InputCombo, Combo, Multiline, ML, MLine, Checkbox, CB, Check, Button, B, Btn, ButtonMenu, Canvas, Column, Col, Combo, Frame, Graph, Image, InputText, Input, In, Listbox, LBox,  Menu, Multiline, ML, MLine, OptionMenu, Output, Pane, ProgressBar,  Radio, Slider, Spin, StatusBar, Tab, TabGroup, Table, Text, Txt, T, Tree, TreeData,  VerticalSeparator, Window, Sizer

import os

from pathlib import Path

#save input text to text-file
def save_draft():

    event, values = window.read()  
    input_text = values['SAVE']
    filename = "txt1.txt"
    with open(filename, 'w') as f:
        text = f.write(input_text)

#load text to input-field
def load_draft ():
    txt1 = Path('txt1.txt').read_text()
    txt1 = txt1.replace('\n', '')
    window['LOAD'].update(txt1)



#Frame
col1 = Column([[Frame('Input Text to .txt-File:', [[Column([[Multiline( key='SAVE', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))

col2 = Column([[Frame('Load .txt-File Content:', [[Column([[Multiline( key='LOAD', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))

#Layout
layout = [
    [col1, col2],
    [sg.Button("SAVE DRAFT"),sg.Button("LOAD DRAFT"), sg.Exit()],
            ]

#create window
window = sg.Window("Input output Tool", layout, element_justification="right")




def main ():


        
    while True:
        event, values = window.read()


        if event == sg.WIN_CLOSED or event == "Exit":
            break


        if event == "SAVE DRAFT":
            save_draft ()


        elif event == "LOAD DRAFT":
            load_draft ()



    window.close()

   


if __name__ == "__main__":
    main()
Was muss ich ändern, damit save_draft() wieder normal funktioniert, ohne diese neue Zeile (siehe oben) ?

Und sieht der Code sonst strukturiert genug aus? Oder immer noch etwas falsch?


__blackjack__ hat geschrieben: Sonntag 5. Juni 2022, 10:28 @marlon_germany: Die Funktion sollte aber nicht in einer anderen Funktion definiert werden sondern auf Modulebene. Du hast 2. nicht umgesetzt: Funktionen bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben und greifen da nicht einfach so magisch drauf zu. `save_draft()` benötigt `values` oder gleich den `input_text` als Argument.

Was hat denn `text` am Ende als Wert? Der Name passt da nicht zu. Und verwendet wird er auch nirgends.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung mit angeben.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier (viewtopic.php?p=405415#p405415) hatte ich Dir doch schon vor langer Zeit gezeigt, wie man so eine GUI richtig aufbaut, ohne globale Variablen, ohne ewig langen Zeilen, die niemand erfassen kann.
Arbeite doch die Antworten, die man Dir hier gibt, mal durch, bei Verständnisproblemen kannst Du gerne fragen, aber wenn Du immer wieder mit Deinem alten Code ankommst, vergeht mir die Lust, immer wieder die selben Fehler anzusprechen.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marlon_germany: Du hast doch den konkreten Vorschlag den Du *nicht* umgesetzt hast, in Deinem Beitrag unten noch mal zitiert. Wenn die Funktion `values` benötigt, muss das *übergeben* werden. Da wo die Funktion aufgerufen wird, hast Du das Objekt doch, also kannst Du das ganz einfach als Argument beim Aufruf übergeben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Ok hier bin ich nochmal.
Ich denke ich habe es nun endlich einigermaßen hinbekommen.
Sirius3 hat geschrieben: Mittwoch 22. Juni 2022, 06:55 Hier (viewtopic.php?p=405415#p405415) hatte ich Dir doch schon vor langer Zeit gezeigt, wie man so eine GUI richtig aufbaut, ohne globale Variablen, ohne ewig langen Zeilen, die niemand erfassen kann.
Arbeite doch die Antworten, die man Dir hier gibt, mal durch, bei Verständnisproblemen kannst Du gerne fragen, aber wenn Du immer wieder mit Deinem alten Code ankommst, vergeht mir die Lust, immer wieder die selben Fehler anzusprechen.
Ich hatte dein Code-Beispiel damals ausprobiert und dann irgendwie aus den Augen verloren, da der Code zwar die App öffnet aber den eingebenen Text nicht in die .docx-Datei speichert.

In deinem Code standen richtigerweise die Funktionen nicht innerhalb der main-Funktion. Bei mir zu dem Zeitpunkt schon, wurch meine Save und Load Funktionen durch die "event, values = window.read()" Variable versorgt waren und so funktionierten. Dann als ich die Save und Load Funktionen aus der main-Funktion nahm, lief es plötzlich nicht mehr und ich suchte vergeblich woanders nach der Lösung.

denn....
__blackjack__ hat geschrieben: Mittwoch 22. Juni 2022, 07:13 @marlon_germany: Du hast doch den konkreten Vorschlag den Du *nicht* umgesetzt hast, in Deinem Beitrag unten noch mal zitiert. Wenn die Funktion `values` benötigt, muss das *übergeben* werden. Da wo die Funktion aufgerufen wird, hast Du das Objekt doch, also kannst Du das ganz einfach als Argument beim Aufruf übergeben.
...ich habe nach langer Zeit erst jetzt begriffen, das der Parameter "values" in der Funktions-Klammer stehen muss und dass in der Main-Funktion beim Aufrufen der Save und Load Funktionen in die Klammern die entsprechenden Argumente geschrieben werden müssen, damit die Funktionen außerhalb der main-Funktion existieren können.

Bzgl. der Fehlermeldung (NameError: name 'values' is not defined) war die ganze Zeit meine Annahme, dass ich eine Zeile unterhalb von "def save_draft ():" "values" durch eine variable definieren muss...(vales = ....)


Vielen Dank nochmal für eure Geduld und die ausdrücklichen Hinweise!

Das Resultat ist nun folgendes:

Code: Alles auswählen

import PySimpleGUI as sg
# this one long import has the effect of making the code more compact as there is no 'sg.' prefix required for Elements
from PySimpleGUI import InputCombo, Combo, Multiline, ML, MLine, Checkbox, CB, Check, Button, B, Btn, ButtonMenu, Canvas, Column, Col, Combo, Frame, Graph, Image, InputText, Input, In, Listbox, LBox,  Menu, Multiline, ML, MLine, OptionMenu, Output, Pane, ProgressBar,  Radio, Slider, Spin, StatusBar, Tab, TabGroup, Table, Text, Txt, T, Tree, TreeData,  VerticalSeparator, Window, Sizer

import os
from pathlib import Path

#Columns & Frames
col1 = sg.Column([
    [sg.Frame('Input Text to .txt-File:', [
        [sg.Column([[sg.Multiline( key='SAVE', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))

col2 = sg.Column([
    [sg.Frame('Load .txt-File Content:', [
        [sg.Column([[sg.Multiline( key='LOAD', size=(15,20)),]],size=(150,400))]])]], pad=(0,0))

#Layout
layout = [
    [col1, col2],
    [sg.Button("SAVE DRAFT"),sg.Button("LOAD DRAFT"), sg.Exit()], 
                ]

#create window
window = sg.Window("Input output Tool", layout, element_justification="right")

 

#save input text to text-file
def save_draft(values):

    input_text = values['SAVE']
    filename = "txt1.txt" 
    with open(filename, 'w') as f: 
        text = f.write(input_text) 

#load text to input-field
def load_draft (window):
    txt1 = Path('txt1.txt').read_text()
    txt1 = txt1.replace('\n', '')
    window['LOAD'].update(txt1)


#main loop
def main ():


    while True:
        event, values = window.read()
        

        if event == sg.WIN_CLOSED or event == "Exit":
            break


        if event == "SAVE DRAFT":
            save_draft (values)
           

        elif event == "LOAD DRAFT":
            load_draft (window)



    window.close()




if __name__ == "__main__":
    main()






Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@marlon_germany: Was soll denn diese krass lange Importzeile? Da verliert man doch total den Überblick. Oder kannst Du mal eben durch drauf schauen sagen wie viele Namen da unnötigerweise doppelt importiert werden‽

Unnötig sind letztlich *alle*, weil kein einziger davon tatsächlich im Programm benutzt wird.

Das `os`-Modul wird auch nicht verwendet.

Der Code der die GUI definiert gehört immer noch nicht auf Modulebene.

Ob ein Name an einen von mehreren Werten gebunden ist, kann man kürzer mit ``in`` und einer Liste mit den Werten ausdrücken, statt mehrere Bedingungen mit ``or`` zu verknüpfen.

Die beiden `Column`-Objekte werden fast identisch erstellt. Solche Code-Kopien vermeidet man. Durch Funktionen und/oder Schleifen.

Beim laden verwendest Du `Path`, beim speichern dann aber nicht. Warum diese Inkonsistenz?

Man muss nicht jedes kleine Zwischenergebnis an einen Namen binden. Und man nummeriert keine Namen.

Den Dateinamen sollte man nur einmal im Programm stehen haben. Ist auch wieder so eine Wiederholung die man vermeidet.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

import PySimpleGUI as sg

TEXT_FILE_PATH = Path("txt1.txt")
ENCODING = "utf-8"


def save_draft(values):
    TEXT_FILE_PATH.write_text(values["SAVE"], encoding=ENCODING)


def load_draft(window):
    window["LOAD"].update(
        TEXT_FILE_PATH.read_text(encoding=ENCODING).replace("\n", "")
    )


def create_column(title, key):
    return sg.Column(
        [
            [
                sg.Frame(
                    title,
                    [
                        [
                            sg.Column(
                                [[sg.Multiline(key=key, size=(15, 20))]],
                                size=(150, 400),
                            )
                        ]
                    ],
                )
            ]
        ],
        pad=(0, 0),
    )


def main():
    layout = [
        [
            create_column("Input Text to .txt-File:", "SAVE"),
            create_column("Load .txt-File Content:", "LOAD"),
        ],
        [sg.Button("SAVE DRAFT"), sg.Button("LOAD DRAFT"), sg.Exit()],
    ]
    window = sg.Window(
        "Input output Tool", layout, element_justification="right"
    )

    while True:
        event, values = window.read()

        if event in [sg.WIN_CLOSED, "Exit"]:
            break

        if event == "SAVE DRAFT":
            save_draft(values)

        elif event == "LOAD DRAFT":
            load_draft(window)

    window.close()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
marlon_germany
User
Beiträge: 33
Registriert: Samstag 30. April 2022, 23:32

Danke für die Infos und das Codebeispiel, wie das ganze besipielhaft aussieht.
PS: Die ganze lange unnötige Importzeile, hatte ich von einem anderen Projekt rüberkopiert, weil ich noch nicht wusste, ob ich evt. andere Pakete brauche.
__blackjack__ hat geschrieben: Donnerstag 23. Juni 2022, 18:15 @marlon_germany: Was soll denn diese krass lange Importzeile? Da verliert man doch total den Überblick. Oder kannst Du mal eben durch drauf schauen sagen wie viele Namen da unnötigerweise doppelt importiert werden‽

Unnötig sind letztlich *alle*, weil kein einziger davon tatsächlich im Programm benutzt wird.

Das `os`-Modul wird auch nicht verwendet.

Der Code der die GUI definiert gehört immer noch nicht auf Modulebene.

Ob ein Name an einen von mehreren Werten gebunden ist, kann man kürzer mit ``in`` und einer Liste mit den Werten ausdrücken, statt mehrere Bedingungen mit ``or`` zu verknüpfen.

Die beiden `Column`-Objekte werden fast identisch erstellt. Solche Code-Kopien vermeidet man. Durch Funktionen und/oder Schleifen.

Beim laden verwendest Du `Path`, beim speichern dann aber nicht. Warum diese Inkonsistenz?

Man muss nicht jedes kleine Zwischenergebnis an einen Namen binden. Und man nummeriert keine Namen.

Den Dateinamen sollte man nur einmal im Programm stehen haben. Ist auch wieder so eine Wiederholung die man vermeidet.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

import PySimpleGUI as sg

TEXT_FILE_PATH = Path("txt1.txt")
ENCODING = "utf-8"


def save_draft(values):
    TEXT_FILE_PATH.write_text(values["SAVE"], encoding=ENCODING)


def load_draft(window):
    window["LOAD"].update(
        TEXT_FILE_PATH.read_text(encoding=ENCODING).replace("\n", "")
    )


def create_column(title, key):
    return sg.Column(
        [
            [
                sg.Frame(
                    title,
                    [
                        [
                            sg.Column(
                                [[sg.Multiline(key=key, size=(15, 20))]],
                                size=(150, 400),
                            )
                        ]
                    ],
                )
            ]
        ],
        pad=(0, 0),
    )


def main():
    layout = [
        [
            create_column("Input Text to .txt-File:", "SAVE"),
            create_column("Load .txt-File Content:", "LOAD"),
        ],
        [sg.Button("SAVE DRAFT"), sg.Button("LOAD DRAFT"), sg.Exit()],
    ]
    window = sg.Window(
        "Input output Tool", layout, element_justification="right"
    )

    while True:
        event, values = window.read()

        if event in [sg.WIN_CLOSED, "Exit"]:
            break

        if event == "SAVE DRAFT":
            save_draft(values)

        elif event == "LOAD DRAFT":
            load_draft(window)

    window.close()


if __name__ == "__main__":
    main()
Antworten