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...)
Entry. Einträge sollen bestehen bleiben!
- Windtommyhoff
- User
- Beiträge: 32
- Registriert: Donnerstag 15. März 2007, 13:01
- Kontaktdaten:
-
- 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?
Darauf hätte man aber kommen können, oder?
I am not part of the allesburner. I am the [url=http://allesburner.de]allesburner[/url].
- 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!
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!
-
- 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
Gruß, jj
- 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 ) Denkanstoß!
Es verabschiedet sich bis zum nächsten Mal
Windtommyhoff
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 ) Denkanstoß!
Es verabschiedet sich bis zum nächsten Mal
Windtommyhoff
- 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:
Viel Spaß,
Michel
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()
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...