Seite 1 von 1

Variable als Listenindex

Verfasst: Mittwoch 27. April 2005, 19:56
von target
Hey,
ich habe folgendes Problem, ich will in einer while Schleife mehrere Eingabefelder erstellen, deren Werte natürlich auch in unterschiedlichen Variablen gespeichert werden (oder halt als Liste). Allerdings bekomm ich das nicht hin.

Code: Alles auswählen

Mannsname=[]
i=0
row=4
column=0
MansT=Label(root, text="Mannschaftsnamen")
MansT.grid(row=3, column=2)
while i < manns:
       global Mannsname
       column=column+1
       MannsnameE = Entry(root, width="18", textvariable=Mannsname[i])
       MannsnameE.grid(row=row, column=column)
       i=i+1
Das war mein erster Versuch, scheitert mit folgender Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "C:\Python24\tipp.py", line 127, in create
    MannsnameE = Entry(root, width="18", textvariable=Mannsname[i])
IndexError: list index out of range
Ich weiß halt nicht, wie ich den Variablenwert als Listenindex bekomme?! Danke im Vorraus.

Verfasst: Mittwoch 27. April 2005, 20:07
von jens
Irgendwie blicke ich zwar nicht richtig was du machen willst. Generell gilt es eine while-Schleife besser als for-Schleife zu realisieren...

Hier mal eine Verbesserung:

Code: Alles auswählen

Mannsname=[]
row=4
column=0
MansT=Label(root, text="Mannschaftsnamen")
MansT.grid(row=3, column=2)
for i in xrange( len(manns) ):
       global Mannsname
       column += 1
       Mannsname.append( StringVar() )
       MannsnameE = Entry(root, width="18", textvariable=Mannsname[i])
       MannsnameE.grid(row=row, column=column)
richtig ist das bestimmt auch nicht, aber ich weiß auch nicht genau was du machen willst :wink:

Schau dir mal das hier an:
http://de.wikibooks.org/wiki/Python-Pro ... nen#Listen

Verfasst: Mittwoch 27. April 2005, 20:13
von target
Ok, ich versuchs mal mit 'nem Beispiel zu erklären!

manns steht für die Anzahl der Mannschaften.. nehmen wir als Beispiel 2

Das heißt: Die while-Schleife läuft zweimal durch und erstellt 2 Textfelder. Diesen Textfeldern sollen über textvariable= Variablen zugeordnet werden. Die Variablen müssen verschiedene Namen haben, da die Variable sonst vom 2. Textfeld überschrieben würde. Daher habe ich versucht die Variable i, die sich bei jedem Durchlauf verändert, mit in den Variablennamen einzubauen bzw. sie als Listenindex zu benutzen, damit ich für jedes Textfeld eine eigenen Eintrag habe, den ich auch auswerten kann! Hoffe, du verstehst, was ich meine?!

Verfasst: Mittwoch 27. April 2005, 20:17
von mawe
Hi!

Ich hab den Thread mal hier her verschoben.

Na gut, jens hat ja schon eine nette Lösung gezegt. Habs mal etwas ausgebaut:

Code: Alles auswählen

from Tkinter import *

def get_names():
    for name in Mannsname:
        print name.get()

root = Tk()
manns = 10
Mannsname = []
MannsnameE = []
Label(text="Mannschaftsnamen").pack()
for i in range(manns):
    Mannsname.append(StringVar())
    MannsnameE.append(Entry(width=18,textvariable=Mannsname[i]))
    MannsnameE[-1].pack()
Button(text="Zeige Namen", command=get_names).pack()
root.mainloop()
Ist das in etwa was Du willst?

Gruß, mawe

Verfasst: Mittwoch 27. April 2005, 20:19
von jens
Noch nicht so ganz, aber macht das folgende Sinn?

Code: Alles auswählen

Mannsname=[]
MansT=Label(root, text="Mannschaftsnamen")
row=4
column=2
MansT.grid(row=row, column=column)
for i in xrange( manns ):
       column += 1
       MannsnameE = Entry( root, width="18", textvariable="textfeld_%s" % i )
       MannsnameE.grid(row=row, column=column)
EDIT: Du warst schneller... OK ich halt mich mal raus, hab von Tk() ja keine Ahnung ;)

Verfasst: Mittwoch 27. April 2005, 20:27
von target
Vielen Dank euch beiden! Funktioniert, so wie ich es mir vorstelle :)

Verfasst: Mittwoch 27. April 2005, 20:41
von target
Eine Frage hab ich doch noch, sorry.. hab wohl gerad n blackout oder so.. Ich weiß jedenfalls nichts mit der Funktion get_names() anzufangen. Wie kann ich denn die Werte der Liste ansprechen, wenn ich sie nicht ausgeben möchte? Wenn ich z.B. versuche Mannsname[0] anzusprechen, sagt er mir, dass 0 "out of range" ist.

Code: Alles auswählen

def get_names():
    for name in Mannsname:
        print name.get()

Sorry.. und danke!

Verfasst: Mittwoch 27. April 2005, 21:05
von mawe
Hm, was meinst Du mit ansprechen? Hast Du vielleicht Mannsname noch gar nicht gefüllt?

Gruß, mawe

Verfasst: Mittwoch 27. April 2005, 21:10
von target
Ich versteh das "for name in Mannsname:" nicht ;) Wenn ich mit den Werten weiterarbeiten will, z.b. in 'nem Pulldown-Menu verwenden, anstatt sie auszugeben, wie sprech ich die Werte an?

Verfasst: Mittwoch 27. April 2005, 21:21
von Gast
for name in Mannsname iteriert einfach über die Einträge im Array Mannsname. In Mannsname stehen lauter StringVar()s, mit get() kommst Du an den Inhalt. Also wenn Du den Inhalt des 4. Entrys haben willst, schreibst also ganz einfach Mannsname[3].get().

Verfasst: Mittwoch 27. April 2005, 21:22
von mawe
Ja, das war ich grad. Verd**** Einloggerei :)

Verfasst: Mittwoch 27. April 2005, 21:28
von target
Danke, danke!

Verfasst: Donnerstag 28. April 2005, 06:25
von jens
target hat geschrieben:Ich versteh das "for name in Mannsname:" nicht ;)
Das meinte ich mir, schau dir mal das http://de.wikibooks.org/wiki/Python-Pro ... nen#Listen an... :roll:

Fehler?

Verfasst: Dienstag 3. Mai 2005, 21:18
von target
Nachdem es mir nicht gefiel, dass sich die Buttons des Menüs immer so weit auseinander zogen, hab ich zwei Frames eingerichtet - einen für das Menu (heißt Menu), einen für den Inhalt (Inhalt).. Soweit funktioniert auch alles ganz gut, nur halt nicht die Funktion, die ihr mir letztes Mal definiert habt.

Code: Alles auswählen

           MansT=Label(Inhalt, text="Mannschaftsnamen")
            MansT.grid(row=1, column=2)
           column=1    # Variable column für for-Schleife
            row=1       # Variable row für for-Schleife
            Mannsname = []
            MannsnameE = []
            for i in range(manns):
                if i == 3:      # Überprüfung des Durchlaufs zur Festlegung der Anordnung der Eingabefelder
                    row=row+1
                    column=1
                elif i == 6:
                    row=row+1
                    column=1
                elif i == 9:
                    row=row+1
                    column=1
                elif i == 12:
                    row=row+1
                    column=1
                elif i == 15:
                    row=row+1
                    column=1
                elif i == 18:
                    row=row+1
                    column=1
                Mannsname.append(StringVar())   
                MannsnameE.append(Entry(Inhalt, width=18, textvariable=Mannsname[i]))     
                MannsnameE[-1].grid(row=row, column=column)
                column=column+1
                OkBut=Button(Inhalt,text="Speichern", command=manns_save) 
                OkBut.grid(row=4, column=4)
Leider zeigt er mir nur den Button 'Speichern' an, aber nicht den Text 'Mannschaftsnamen' und die Eingabefelder! Einer 'ne Idee?

Verfasst: Dienstag 3. Mai 2005, 21:39
von mawe
Hi!

Naja, MansT liegt bei row=1, column=2. Dort sitzt aber auch ein Entry, darum sieht man MansT nicht. Warum man die Entries auch nicht sieht, kann ich Dir jetzt leider auch nicht sagen.
Noch eine Kleinigkeit: Die if-Abfragen könntest Du kürzer machen:

Code: Alles auswählen

for i in range(manns):
    if i%3==0:
        row += 1
        column = 1
Gruß, mawe

Verfasst: Dienstag 10. Mai 2005, 16:25
von target
Also.. da ich das Problem selbst nicht gelöst bekomme und mawe wenig Zeit hat, mal die Frage an die anderen, ob sie vielleicht Zeit und Lust hätten mal nach dem Fehler zu schauen.. Wie gesagt, MansT und die Entrys MannsnameE werden leider nicht angezeigt :(

Link zum Code

Danke!