mehrere Entrys auslesen mit selben Namen ?

Fragen zu Tkinter.
Antworten
Octarock
User
Beiträge: 25
Registriert: Dienstag 3. April 2018, 01:21

Hallo,

Ich habe in Python 3 ein Programm geschrieben, welches mit dem Simplex-Algorithmus lineare Gleichungen optimiert. Um die Eingabe handlicher zu gestalten, habe ich eine simples GUI mit TKinter erstellt.
Zu beginn öffnet sich ein Fenster, in welches man die Variablennamen definiert und die Anzahl der Nebenbedingungen. Somit weiß ich ja auch wie vielen und aus welchen Variablen die Nebenbedingung aufgebaut ist.
Beim Klicken auf weiter wird man nun zur Eingabe der Nebenbedingungen un der ZielFunktion weitergeleitet. (Wer mit den Simplexverfahren nix anfangen kann, kein Problem das Problem kommt noch, ich erkläre nur das alles um die Fragen zu vermeiden "Warum machst du es nicht anders?")
Nun habe ich also ein Fenster das dem entsprechend aufgebaut ist, was man beim ersten Fenster eingegeben hat (Wie viele NebenBedingungen, wie viele Werte pro NB / ZF definiert werden müssen)

Code: Alles auswählen

for i in range(Anzahl_NB):
    Label_Anweisung_NB = Label(Berechnen, text = str(i + 1) + ".NB: Werte der Variablen: ")
    Label_Anweisung_NB.grid(row = i, column = 0)
    for x in range(Anzahl_Variablen):
        Input_Werte_NB = Entry(Berechnen, bd=5, width=5)
        Input_Werte_NB.grid(row = i, column = 2*x + 1)
        Label_Name_Variable_NB = Label(Berechnen, text = Namen_Variablen[x])
        Label_Name_Variable_NB.grid(row = i, column = 2*x + 2)

Label_Anweisung_ZF = Label(Berechnen, text = "  ZF: Werte der Variablen")
Label_Anweisung_ZF.grid(row = i+1, column = 0)
for x in range(Anzahl_Variablen):
    Input_Werte_ZF = Entry(Berechnen, bd=5, width=5)
    Input_Werte_ZF.grid(row = i+1, column = 2*x + 1)
    Label_Name_Variable_ZF = Label(Berechnen, text = Namen_Variablen[x])
    Label_Name_Variable_ZF.grid(row = i+1, column = 2*x + 2)
    
Berechnen_Button = Button(Berechnen, text="Berechnen", command=berechnen_action)
Quit_Button = Button(Berechnen, text="Beenden", command=fenster.quit)
Berechnen_Button.grid(row = i+6, column = 0)
Quit_Button.grid(row = i+6, column = 1)
Da ist nun also ein Fenster, bei welchen alle Entrys der NB / ZF gleich heißen und wenn ich die dann auslesen will, weiß ich nicht, wie ich die alle und nicht nur das Letzte auslese.
(für den Simplex-Algorithmus muss ich alle Werte nach einander in einer Liste speichern)
Und ich kann denen ja keine jeweiligen Namen geben, da ich ja nicht weiß wie viele Variablen bei wie vielen NB. Ich hoffe, ihr könnt mir weiterhelfen bzw. ich stehe nur auf dem Schlauch :)
Freue mich über jede Hilfe.

PS: Wie kann man eigentlich den Text eines Labels erweitern?
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octarock: Du suchst Listen. Einfach die Eingabe-Widgets in eine Liste stecken, dann kannst Du die später auch wieder alle auslesen, egal wie viele es sind. Halt in einer Schleife.

Zum PS: Man kann den alten Wert auslesen und darauf aufbauend einen erweiterten Wert erstellen und den wieder setzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Octarock
User
Beiträge: 25
Registriert: Dienstag 3. April 2018, 01:21

cool aber wie macht man das? (bin ansoluter Tkinter noob)
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat doch nichts mit tkinter zu tun. Eine Liste ist eine Liste. Wenn die (numerische) Werte in einer Liste speichern kannst, wie du selbst sagst, kannst du das auch mit Entry-Objekten machen. Für Python und seine Listen ist das gleich. .
Octarock
User
Beiträge: 25
Registriert: Dienstag 3. April 2018, 01:21

Schon klar aber das Auslesen der Entrys erfolgt ja erst, wenn alle ausgefüllt sind und der Button betätigt wird. Wenn ich NAME_DES_ENTRY.get() sag, gibt er mir die Eingabe des letzten erzeugten Entrys mit den jeweiligen Namen, egal ob ich es in einer Schleife in eine Liste speichern lasse.
Also wenn ich hier etwas grundlegend falsch verstehe bitte noch mal anders erklären, aber ich glaube so lässt sich mein Problem nicht lösen bzw. das Problem wurde noch nicht richtig verstanden.
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Octarock: Du sollst die Entry's in einer Liste speichern und dann später in einer Schleife über diese Liste mit Entry's gehen und auf jedem dieser Entry's aus der Liste die `get()`-Methode aufrufen. Dass das nur mit dem Namen den Du als Laufvariable beim erstellen aller Entry's nicht geht, sondern das man da natürlich nur den Wert vom letzten Entry bekommt das an diesen Namen gebunden wurde, sollte eigentlich sonnenklar sein. Das wäre schon arg magisch wenn da etwas anderes passieren würde. Vor allem *was* hätte denn da sonst anderes passieren sollen?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Doch doch, wir haben das schon begriffen. Das sich das Problem nicht löst, indem man nichts anders macht, ist auch klar.

Also auf ein neues:

Code: Alles auswählen

alle_meine_entries = []
for ... :
     entry = Entry(....)
     alle_meine_entries.append(entry)

def button_command():
       for entry in alle_meine_entries:
               ... # ada guck, nicht nur das letzte
Antworten