Seite 1 von 1

Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 11:02
von Moere
Hallo,
ich stehe wiedermal auf dem Schlauch.
Folgendes Problem:
Ich möchte einen geänderten Text wieder zurück in die Variable schreiben, aus der der Text ausgelesen wurde.
Einlesen funktioniert, Zurücklesen nicht.

Code: Alles auswählen

import tkinter as tk
from tkinter import StringVar, Text, END

root = tk.Tk()
root.geometry('900x400')
root.title('Test')

text = StringVar()
text.set('testtext der geändert werden soll') # wird später aus Datei ausgelesen

def ausg():
    eingabetextfeld.insert(END, text.set()) # geänderter text in variable speichern -> Fehler ???
    ausgabetextfeld.insert(END, text.get()) # geänderter text im Nachbarfeld ausgeben
  
labelInfo = tk.Label(root,font = 'arial 10', text = "Eingabefeld").place(x=20, y=150)
labelInfo = tk.Label(root,font = 'arial 10', text = "Ausgabefeld").place(x=450, y=150)
eingabetextfeld = Text(root, height=15, width=40)
eingabetextfeld.place(x=100, y=15)
ausgabetextfeld = Text(root, height=15, width=40)
ausgabetextfeld.place(x=540, y=15)
eingabetextfeld.insert(END, text.get()) # text aus variable lesen und evtl. editieren
Speichern = tk.Button(root, text='Ausgabe', bd ='5', command = (ausg), 
bg = 'antique white', font = 'arial 10 bold').place(x=400, y=300)
   
root.mainloop()    
    
Der Code ist stark gekürzt, zeigt aber das Problem.

evtl könnte mir jemand zeigen , WO der Denkfehler ist ?
Vielen Dank

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 11:30
von Sirius3
Jetzt wäre es noch nett, wenn du auch die Fehlermeldung, die du bekommst hier posten würdest, das steht nämlich drin, warum es nicht funktioniert.

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 14:47
von Moere
Mein Fehler :-)

eingabetextfeld.insert(END, text.set()) # geänderter text in variable speich
ern -> Fehler ???
TypeError: set() missing 1 required positional argument: 'value'

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 16:01
von __deets__
Sollte das nicht text.get() sein?

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 17:11
von Moere
Stimmt Fehler ist weg,
aber der alte Text bleibt erhalten

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 19:19
von nezzcarth
Moere hat geschrieben: Samstag 13. Februar 2021, 11:02 Ich möchte einen geänderten Text wieder zurück in die Variable schreiben, aus der der Text ausgelesen wurde.
Nebenbemerkung: In Python gibt es keine Variablen. Es gibt nur Objekte, die an Namen gebunden werden. Man weist also einer Variable nichts zu und speichert auch nichts in ihr, sondern man bindet ein (neues) Objekt an einen Namen. Das mag wie eine terminologische Kleinigkeit erscheinen, macht konzeptuell aber schon einen Unterschied.

Re: Variable Inhalt ersetzen

Verfasst: Samstag 13. Februar 2021, 22:31
von sparrow
@Moere: Welcher Text bleibt wo erhalten? Du fügst Text am Ende (END) des bisherigen Textes ein (insert). Wenn ich mich richtig erinnere, muss man unter tk den bisherigen Text vorher löschen, wenn man ihn komplette ersetzen möchte.

Re: Variable Inhalt ersetzen

Verfasst: Montag 15. Februar 2021, 10:18
von Moere
Ok, hat sich Erledigt - habs hinbekommen

Code: Alles auswählen

import tkinter as tk
from tkinter import StringVar, Text, END, messagebox

root = tk.Tk()
root.geometry('900x400')
root.title('Test')

text = StringVar()
text.set('testtext der geändert werden soll') # wird später aus Datei ausgelesen

def ausg():
    result=eingabetextfeld.get("1.0", END+"-1c")
    text.set(result)                        # geänderter text in variable speichern und später in Datei schreiben
    messagebox.showinfo("Gespeichert", "Text gespeichert")
    ausgabetextfeld.insert(END, text.get()) # geänderter text im Nachbarfeld ausgeben
    #command = onSave()
    
labelInfo = tk.Label(root,font = 'arial 10', text = "Eingabefeld").place(x=20, y=150)
labelInfo = tk.Label(root,font = 'arial 10', text = "Ausgabefeld").place(x=450, y=150)
eingabetextfeld = Text(root, height=15, width=40)
eingabetextfeld.place(x=100, y=15)
ausgabetextfeld = Text(root, height=15, width=40)
ausgabetextfeld.place(x=540, y=15)
eingabetextfeld.insert(END, text.get()) # text aus variable lesen und evtl. editieren
Speichern = tk.Button(root, text='Ausgabe', bd ='5', command = (ausg), 
bg = 'antique white', font = 'arial 10 bold').place(x=400, y=300)
   
root.mainloop()    

Re: Variable Inhalt ersetzen

Verfasst: Montag 15. Februar 2021, 18:29
von Sirius3
Benutze kein globalen Variablen. Alles was eine Funktion braucht, muss sie über ihre Argumente bekommen. Es ist wenig sinnvoll, alle Rückgabewerte an Variablen zu binden, vor allem, wenn die None sind.
Benutze kein place, sondern pack oder grid.

Code: Alles auswählen

from functools import partial
import tkinter as tk
from tkinter import messagebox

def ausgabe_speichern(eingabetextfeld, text, ausgabetextfeld):
    result=eingabetextfeld.get("1.0", tk.END+"-1c")
    text.set(result)                        # geänderter text in variable speichern und später in Datei schreiben
    messagebox.showinfo("Gespeichert", "Text gespeichert")
    ausgabetextfeld.insert(tk.END, result) # geänderter text im Nachbarfeld ausgeben
    #command = onSave()


def main():
    root = tk.Tk()
    root.title('Test')
    
    text = tk.StringVar(root, 'testtext der geändert werden soll') # wird später aus Datei ausgelesen
    tk.Label(root, font='arial 10', text="Eingabefeld").grid(row=1, column=1)
    tk.Label(root, font='arial 10', text="Ausgabefeld").grid(row=1, column=3)
    eingabetextfeld = tk.Text(root, height=15, width=40)
    eingabetextfeld.grid(row=1, column=2)
    ausgabetextfeld = tk.Text(root, height=15, width=40)
    ausgabetextfeld.grid(row=1, column=4)
    eingabetextfeld.insert(tk.END, text.get()) # text aus variable lesen und evtl. editieren
    tk.Button(root, text='Ausgabe', bd ='5',
        command=partial(ausgabe_speichern, eingabetextfeld, text, ausgabetextfeld),
        bg='antique white', font='arial 10 bold').grid(row=2, column=2)
    root.mainloop()


if __name__ == "__main__":
    main()