使用for循环创建Optionmenu

时间:2016-12-19 22:30:35

标签: python for-loop tkinter optionmenu

我对Python以及一般的编码都很陌生。

我在列表中存储了42个标签(字符串)。 我的目标是:对于42个标签中的每一个,创建一个显示字符串和下拉列表的Tkinter标签(Tkinter Optionmenu)。

发生两个问题

  • 我得到变量列表的索引错误(对于optionmenus),这是我的控制台的输出:
      

    varDd [i] = StringVar(root)   IndexError:列表分配索引超出范围

  • Canvas可按我的意图滚动,但内容不会随之滚动

我的完整代码: 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)

1 个答案:

答案 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])