我遇到了一些麻烦让我的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()
输出错误
TypeError:list indices必须是整数或切片,而不是str
这表明我对for循环的使用是错误的。我查了一些信息,发现我当然可以遍历一个列表并让它遍历每个项目,例如打印该项目,但是当我有一个封装列表时,我不知道如何实现这个想法我想循环。
答案 0 :(得分:2)
将for s in status[r]:
替换为for s in r:
r
包含status
的元素(在这种情况下,list
要在内部for
循环中迭代),不是索引
出于同样的原因,您还应该将text=status[r][s]
替换为text = s
。
如果您只想要索引,可以使用:
for i in range(len(lst)):
对于某些list
lst
,如果您想要索引和元素(在这种情况下,您需要索引传递列和行值),请使用:
for i, elem in enumerate(lst):
答案 1 :(得分:2)
下面:
for r in items:
tk.Label(frame1, text=items[r]).grid(row=r,column=0)
这不是python的循环工作方式。在for循环体中,r
不是items
中项目的索引, 项目,因此您需要:< / p>
for item in items:
tk.Label(frame1, text=item).grid(row=???,column=0)
但似乎您还希望项目的索引作为row
的{{1}}参数传递。为此,您可以使用.grid()
为enumerate(seq)
的每个元素生成(index, item)
元组:
seq
请注意,您在此处也有类似的问题:
for index, item in enumerate(items):
tk.Label(frame1, text=item).grid(row=index,column=0)
答案 2 :(得分:0)
frame1
标签周围也存在问题。如果您依赖enumerate()
:
for row, text in enumerate(items):
tk.Label(frame1, text=text).grid(row=row,column=0)