Aus for-Schleife erzeugte Entrys einzeln ansprechen

Fragen zu Tkinter.
Antworten
Harrison
User
Beiträge: 2
Registriert: Sonntag 27. Mai 2018, 08:53

Hallo ich habe eine Frage bezüglich dem auslesen von Entrys die mit Hilfe einer Liste und for-Schleife erzeugt worden sind.

mein Test-Code ist:

Code: Alles auswählen

import tkinter as tk
root=tk.Tk()
root.title("Entrys über Schleifen erstelllen und ansprechen")

ListeGrundinfos=["Realname", "Charaktername", "Stärken"]

def auswertung1():
    print(var.get())
    

for var in ListeGrundinfos:
    var=tk.Entry(root, text=var, width=10)
    var.pack()
    

Testbutton=tk.Button(root, text="Testbutton", command=auswertung1)
Testbutton.pack()

root.mainloop()
es werden 3 Entrys erzeugt, jedoch kann ich immer nur das letzte Entry auslesen (klar, da es als letztes die Variable var zugeordnet ist).
ich war der meinung, das dann aus der Variable "var" dann z.b. die Variable "Realname" wird und auch mit Realname.get() ausgelesen werden könnte.

Könnt ihr mir bei meinem Denkfehler helfen und eventuell ein paar tipps geben?

Mit freundlichen Grüßen

Harrison.

Ps. ist Python 3.6
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du auf die Entries zugreifen willst, musst du die dir merken in einer geeigneten Datenstruktur. Je nach Anwendungszweck einer Liste oder einem Wörterbuch. In deinem Fall eher einem Wörterbuch, weil du ja mit der Charaktereigenschaft zugreifen willst.
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hi,

das geht ganz einfach. Die Entrys in eine Liste stecken und dann darüber iterieren.

Code: Alles auswählen


import tkinter as tk
root=tk.Tk()
root.title("Entrys über Schleifen erstelllen und ansprechen")

ListeGrundinfos=["Realname", "Charaktername", "Stärken"]

#Liste für die Entry erstellen
ListeEntry=[]


def auswertung1():
    #zum Ausgeben der Werte über die Liste der Entrys iterieren
    for item in ListeEntry:
        print('Wert: ', item.get())
    #gezielt auf ein Element der Liste zugreifen
    print('Wert 2. Element in der Liste:', ListeEntry[1].get())
    

for var in ListeGrundinfos:
    #StringVar zur Aufnahme des im Entry dargestellten Wertes definieren
    entry_value = tk.StringVar()
    #StringVar an Entry übergeben
    entry_item=tk.Entry(root, textvariable=entry_value, width=10)
    entry_item.pack()

    #erzeugtes Entry in die Liste stecken
    ListeEntry.append(entry_item)

#einfach mal die Liste mit den Entrys ausgeben
print('ListeEntry: ', ListeEntry)


Testbutton=tk.Button(root, text="Testbutton", command=auswertung1)
Testbutton.pack()

root.mainloop()


mfg
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Harrison hat geschrieben: Sonntag 27. Mai 2018, 09:20

Code: Alles auswählen

ListeGrundinfos=["Realname", "Charaktername", "Stärken"]

for var in ListeGrundinfos:
    var=tk.Entry(root, text=var, width=10)
    var.pack()
Könnt ihr mir bei meinem Denkfehler helfen und eventuell ein paar tipps geben?
Hallo Harrison,
dein "Denkfehler" (eher Verständnisproblem Zuweisung von Werten etc an Variablen) ist folgender;
In der for-Schleife iteriers du über die Liste "ListeGrundinfos mit der Variablen var,
das bedeutet, der Variablen var werden im ersten Schleifendurchlauf der Wert/String "Realname", dann "Charaktername" und dann "Stärken" zugewiesen
in der Schleife weist du der Variablen dann ein tk.Entry Objekt zu, das geht, ist aber kein schöner Codestil
mit jedem Durchlauf wird der Variablen var ein neues tk.Entry Objekt zugewiesen, das vorherige ist damit gelöscht.
Das erklärt wieso du nur das letzte auslesen konntest.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Harrison
User
Beiträge: 2
Registriert: Sonntag 27. Mai 2018, 08:53

Super vielen Dank für die schnelle und überaus gute Hilfe.

ich habe es gleich mal Ausprobiert (selbst versucht den code zu schreiben) und es hat super geklappt!

vielen vielen Dank.

Grüße Harrison
Antworten