我对Python以及一般的编码都很陌生。
我在列表中存储了42个标签(字符串)。 我的目标是:对于42个标签中的每一个,创建一个显示字符串和下拉列表的Tkinter标签(Tkinter Optionmenu)。
发生两个问题:
varDd [i] = StringVar(root) IndexError:列表分配索引超出范围
我的完整代码: https://codepaste.net/6jkuza
必不可少的部分:
def createDdList():
del labelsDd[:]
del listsDd[:]
if len(labels) > 1:
varDd = [len(labels)]
for i,label in enumerate(labels):
# Erstelle Labels mit den Markerlabels im scrollbaren Canvas
labelsDd.append(Label(contentCanvas,text=label))
labelsDd[i].pack()
# Erstelle die Dropdown Listen im scrollbaren Canvas
varDd[i] = StringVar(root)
listsDd.append(OptionMenu(canvas,varDd[i],*labels))
listsDd[i].place(x=70,y=10+(30*i))
contentCanvas = Frame(canvas,bg='#FFFFFF')
canvas.create_window((0,375),window=contentCanvas)
答案 0 :(得分:0)
第一个问题就是这样:
varDd = [len(labels)]
虽然这种语法在其他语言中用来表示"在python中包含这么多元素的列表,它只是一个带有一个数字的列表:
>>> labels = range(4)
>>> v = [len(labels)]
>>> v
[4]
相反,你可能想要一些类似的东西:
>>> varDb = [None]*len(labels)
>>> varDb
[None, None, None, None]
然后您可以使用与其他列表相同的方式对其进行索引
另一个问题是在画布中使用.place()
会将其放在屏幕上但不会放在画布空间本身上,为此,您需要调用canvas.create_window
所以这一行:
listsDd[i].place(x=70,y=10+(30*i))
会转化为:
canvas.create_window(70, 10+(30*i), window = listsDd[i])