Variable als Listenindex

Fragen zu Tkinter.
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 19:56

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.
Zuletzt geändert von target am Mittwoch 27. April 2005, 20:11, insgesamt 1-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 27. April 2005, 20:07

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 20:13

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?!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 27. April 2005, 20:17

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 27. April 2005, 20:19

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 ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 20:27

Vielen Dank euch beiden! Funktioniert, so wie ich es mir vorstelle :)
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 20:41

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!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 27. April 2005, 21:05

Hm, was meinst Du mit ansprechen? Hast Du vielleicht Mannsname noch gar nicht gefüllt?

Gruß, mawe
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 21:10

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?
Gast

Mittwoch 27. April 2005, 21:21

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().
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 27. April 2005, 21:22

Ja, das war ich grad. Verd**** Einloggerei :)
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Mittwoch 27. April 2005, 21:28

Danke, danke!
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 28. April 2005, 06:25

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:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
target
User
Beiträge: 9
Registriert: Mittwoch 27. April 2005, 19:50

Dienstag 3. Mai 2005, 21:18

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?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Dienstag 3. Mai 2005, 21:39

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
Antworten