Entry. Einträge sollen bestehen bleiben!

Fragen zu Tkinter.
Antworten
Benutzeravatar
Windtommyhoff
User
Beiträge: 32
Registriert: Donnerstag 15. März 2007, 13:01
Kontaktdaten:

Guten Morgen Forum.

Ich komme so langsam aber sicher mit meinem Programm zum Ende. Ich hab nun eine Vielzahl an Eingabefeldern, die immer wieder neu generiert werden, sobald ich eine Auswahl abändere. Ich also z.B. 2 Eingaben weg fallen lasse. Die Eingaben werden halt immer wieder neu generiert.
Ich hab also z.B. Radiobuttons, mit denen ich z.B. auswählen kann, wieviele Eingabefelder ich haben will und sobald ich z.B. 3 ausgewählt habe und vorher 4 hatte, werden die 4 Eingabefelder entfernt und 3 neue hingebaut.

Das Problem ist jetzt, dass auch die Eingaben, die schon in den Entry standen verschwunden sind. Das ist bei der Benutzung allerdings etwas ...blöd, wenn man immer wieder ca 20 Eingaben neu machen muss!

Kriege ich es irgendwie hin, dass immer nur die Eingaben "erneuert" werden, die auch ausgewählt wurden und alle anderen bleiben einfach bestehen?!


Ich wäre mal echt froh, wenn da jemand einen guten Tipp für mich hätte!

Gruß

Windtommyhoff


PS: Mein Code ist mittlerweile über 1400 Zeilen lang, deswegen erstmal kein Code. Ich mache das alles über eine Funktion, die halt alle Eingaben verwaltet. Diese Funktion wird immer wieder neu aufgerufen, sobald ein Button betätigt wird. ( ich persönlich hätte das ja anders gemacht, aber die beauftragenden User wollten das unbedingt so, dass die Eingabefelder immer wieder sofort abgeändert werden...)
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Gleich zwei gute Tipps: Lösche nur die letzten Entrys, dann musst du den Inhalt der vorherigen nicht wieder setzen. Oder aber du speicherst vor dem Löschen den Inhalt der betreffenden Entrys in einer ansprechenden Datenstruktur und überträgst das wiederum nachdem du die neuen Felder erstellt hast.

Darauf hätte man aber kommen können, oder? :roll:
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
Benutzeravatar
Windtommyhoff
User
Beiträge: 32
Registriert: Donnerstag 15. März 2007, 13:01
Kontaktdaten:

Hört sich jatzt vielleicht doof an, aber auf genau die Idee bin ich vor ca 5 Minuten auch gekommen! :?

Ich werde versuchen, dass er die Eingaben speichert, sobald die linke Maustaste gedrückt wird. Und sobald die Entrys neu aufgebaut werden...wird das wieder eingefügt...mal sehen, ich meld mich!

Danke für die Antwort!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Ich kenn jetzt nicht den genauen Aufbau und die Anordnung der Widgets, aber vlt. musst du die Entries usw. nicht löschen, sondern nur den verwendeten Geometrymanager deaktivieren. Wenn das geht, wär das eigentlich das besste, denn du die Widgets bleiben erhalten und müssen nicht neu generiert und "befüllt" werden...

Gruß, jj
Benutzeravatar
Windtommyhoff
User
Beiträge: 32
Registriert: Donnerstag 15. März 2007, 13:01
Kontaktdaten:

Prima, klappt!

Ich hab nun einfach alle Knöpfe die die Entrys verändern mit dem <Button-1> gebindet und eine Funktion geschreiben, die alle Entrys ausleist und wegspeichert. Dann mußte ich nur noch die gespeicherten Daten, die ich zu Beginn einmal als leere Strings initialisiert hatte, bei jeden Aufruf der Eingabenfunktion in die Entrys einsetzen.

Danke für den (leider etwas späten, weil ich ja selbst drauf gekommen bin :lol: ) Denkanstoß!

Es verabschiedet sich bis zum nächsten Mal

Windtommyhoff
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Windtommyhoff,

warum benutzt Du nicht die StringVar oder IntVar Objekte von Tkinter (heißen Kontrollvariablen), genau für solche Anwendungsfälle sind die gedacht. Ich habe mal schnell eine kleine Demo geschrieben, die die Funktion der Kontrollvariablen ebenso zeigt wie den Vorschlag vom Schlangenbeschwörer, die Entries nur auszublenden statt zu löschen. Das geht erstens schneller und zweitens speichert ein .grid_remove() die Konfiguration und Du kannst sie mit .grid() sofort wieder plazieren. Na, sieh es Dir einfach mal an:

Code: Alles auswählen

import Tkinter as TK

iAnzahl = 4

wTk = TK.Tk()
wTk.title("Beispiel: Tkinter Kontrollvariablen")

#   Stringvariablen erzeugen, Startwert ist ""
lStringVars = [TK.StringVar() for i in xrange(iAnzahl)]

lEntries = []
vVisibleEntries = TK.IntVar()
vVisibleEntries.set(iAnzahl-1)

#   Frames erzeugen
wRadioFrame = TK.Frame(wTk, relief=TK.SUNKEN, bd=3)
wRadioFrame.grid(row=0, column=0, ipadx=20, ipady=20, sticky=TK.NSEW)
wEntryFrame = TK.Frame(wTk, relief=TK.SUNKEN, bd=3)
wEntryFrame.grid(row=0, column=1, ipadx=20, ipady=20, sticky=TK.NSEW)

def update_entries_visibility(iNumber):
    for i in xrange(len(lEntries)):
        wEntry = lEntries[i]
        
        #   sichtbar machen, wenn die Nummer des Eintrags kleiner gleich die Gewaehlte ist
        if i <= iNumber:
            wEntry.grid()
            
        #   sonst unsichtbar machen - merkt sich aber die Position und
        #   kann mit .grid() wieder angezeigt werden
        else:
            wEntry.grid_remove()
            
def change_entry_count():
    iSelected = vVisibleEntries.get()
    print "Auswahlindex:", iSelected
    update_entries_visibility(iSelected)

def werte_auslesen():
    for i in xrange(iAnzahl):
        print lStringVars[i].get()
        
#   Radiobuttons und Eingabefelder erzeugen
for i in xrange(iAnzahl):
    #   Eingabefeld...
    wEntry = TK.Entry(wEntryFrame, textvariable=lStringVars[i])
    wEntry.grid(pady=5)
    lEntries.append(wEntry)

    #   Radiobutton...    
    TK.Radiobutton(wRadioFrame, text="%i Eingabefeld%s"%(i+1, int(i!=0)*"er" ), value=i,
                   variable=vVisibleEntries, command=change_entry_count).grid(sticky=TK.NSEW, pady=5)

TK.Button(wTk, text="Werte auslesen", width=30, command=werte_auslesen
         ).grid(row=1, column=0, columnspan=2, pady=5)
wTk.mainloop()
Viel Spaß,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten