2017-11-09 1 views
1

Ich habe einige Probleme bekommen meine For-Schleife arbeiten, die eine Reihe von Etiketten in einem Fenster erstellen soll. Hier ist der Code-Schnipsel:Inkrementieren über eine Liste in einer Liste (gekapselte Liste)

import tkinter as tk 
root = tk.Tk() 
#Frame 1: components 
frame1 = tk.Frame(root).grid(row=0) 
items = ['REED', 'PIR', 'VIBR', 'REED', 'PIR'] 
for r in items: 
    tk.Label(frame1, text=items[r]).grid(row=r,column=0) 
#Frame 2: statusList 
frame2 = tk.Frame(root).grid(row=1) 
status = [[True, False, True, False], 
     ['14:00:00', '13:24:31', '15:58:32', '08:33:01']] 
for r in status: 
    for s in status[r]: 
     tk.Label(frame2, text=status[r][s]).grid(row=s,column=r) 
root.mainloop() 

Es gibt den Fehler

TypeError: list indices must be integers or slices, not str

Was mich darauf hingewiesen, dass meine Nutzung der for-Schleife ist falsch. Ich habe einige Informationen nachgeschaut und festgestellt, dass ich sicher eine Liste durchlaufen kann und sie durch jedes Element gehen lassen und zum Beispiel dieses Element drucken kann, aber bis jetzt weiß ich nicht, wie ich diese Idee umsetzen soll, wenn es eine gekapselte Liste gibt das möchte ich durchlaufen.

+0

Sie die Frage nicht ändern, um die Antwort zu schließen, ist es nicht hilfreich für zukünftige Zuschauer. – yinnonsanders

Antwort

2

hier:

for r in items: 
    tk.Label(frame1, text=items[r]).grid(row=r,column=0) 

So funktioniert pythons for-Schleife nicht. In dem für den Körper der Schleife ist r nicht der Index des Elements in items, es ist das Element, so müssen Sie:

for item in items: 
    tk.Label(frame1, text=item).grid(row=???,column=0) 

aber es scheint, dass Sie auch den Index des Elements wollen passieren wie das row Argument für .grid(). Hierfür können Sie enumerate(seq) verwenden, die für jedes Element von seq ein (index, item) Tupel ergibt:

for index, item in enumerate(items): 
    tk.Label(frame1, text=item).grid(row=index,column=0) 

Beachten Sie, dass auch ein ähnliches Problem hier haben:

status = [[True, False, True, False], 
     ['14:00:00', '13:24:31', '15:58:32', '08:33:01']] 
for r in status: 
    for s in status[r]: 
     tk.Label(frame2, text=status[r][s]).grid(row=s,column=r) 
+0

Ok, das hat mein Loop-Problem wirklich behoben, nur für mich, um herauszufinden, dass ich auch Fensterprobleme habe. Aber das ist eine Geschichte für einen anderen Tag, denke ich. – HackXIt

2

Ersetzen for s in status[r]: mit for s in r:

r enthält ein Element von status (in diesem Fall der list in der inneren Schleife for iterieren), keinen Index.

Sie sollten auch text=status[r][s] durch ersetzen, aus dem gleichen Grund.

Wenn Sie nur die Indizes möchten, können Sie verwenden:

for i in range(len(lst)): 

für einige listlst und wenn Sie beide Indizes und Elemente wollen (in diesem Fall müssen Sie die Indizes in der Spalte und Zeile zu übergeben Werte) verwenden:

for i, elem in enumerate(lst): 
+0

: O keeps Nicht was ich erwartet habe, danke für die schnelle Antwort. Ich werde es ausprobieren – HackXIt

+0

Wenn Sie über Indizes iterieren wollen, können Sie 'für i im Bereich (len (lst)):' verwenden, aber in den meisten Fällen wollen Sie über die tatsächlichen Elemente iterieren. – yinnonsanders

+1

@yinnonsanders besser verwenden 'enumerate (lst)', wenn Sie sowohl die Elemente und ihre Indizes möchten. –

0

Sie auch ein Problem haben rund um die Etiketten frame1. Sie können das Problem beheben, wenn Sie auf enumerate() verlassen:

for row, text in enumerate(items): 
    tk.Label(frame1, text=text).grid(row=row,column=0) 
Verwandte Themen