2017-11-09 7 views
1

forループを作成する際にいくつかの問題があります。これはウィンドウ内に多数のラベルを作成することになっています。ここ は、コードスニペットです:リスト内のリストを増やす(カプセル化されたリスト)

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

これは、forループの私の使い方が間違っていることを私に示されたエラー

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

を出力します。私はいくつかの情報を調べて、確かにリストをループして各項目を通過させることができ、例えばその項目を印刷することができることを発見しましたが、カプセル化されたリストがあるとき私はループしたい。

+0

回答を含めるように質問を変更しないでください。将来の視聴者には役に立たないです。 – yinnonsanders

答えて

2

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

これはPythonのforループがどのように動作するかではありません。ループの体のために、ritemsでのアイテムのインデックスではありませんで、それアイテムですので、あなたが必要があると思います:

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

あなたが、アイテムのインデックスを渡したいようです.grid()の引数はrowです。

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

これは本当に私のループの問題を解決しました。私には窓の問題もあることが分かりました。しかし、それは私が推測する別の日の話です。 – HackXIt

2

for s in r:

rfor s in status[r]:を交換指標ないstatusの元素を含む(この場合listが内側forループで反復処理するために)、

同じ理由でtext=status[r][s]text = sに置き換える必要があります。

あなただけのインデックスをしたい場合は、あなたが使用することができますいくつかのlistlstため

for i in range(len(lst)): 

、あなたはインデックスと要素の両方をしたい場合(この場合には、あなたは、インデックスは、列と行に渡す必要があります値)は、使用します。ここで

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

:O gasps 私が期待していたものではありません。試してみます – HackXIt

+0

インデックスを反復処理したい場合は、 'for i in range(len(lst)):'を使うことができますが、ほとんどの場合、実際の要素に対して反復処理を行いたいことがあります。 – yinnonsanders

+1

@yinnonsandersは、アイテムとそのインデックスの両方が必要な場合は、 'enumerate(lst)'を使用する方が良いでしょう。 –

0

あなたはまたのラベルの周りに問題があります。

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

注意あなたがここにも同様の問題があります。このためにはseqの各要素に対して(index, item)タプルになりenumerate(seq)を使用することができますframe1enumerate()に頼ると修正できます。

for row, text in enumerate(items): 
    tk.Label(frame1, text=text).grid(row=row,column=0) 
関連する問題