使用 for 循环创建 Optionmenu

Create Optionmenu with for loop

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

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

出现两个问题

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

第一个问题是这样产生的:

varDd = [len(labels)]

虽然此语法在其他语言中用于表示“python 中包含这么多元素的列表,但它只是一个包含一个数字的列表:

>>> labels = range(4)
>>> v = [len(labels)]
>>> v
[4]

相反,您可能想要这样的东西:

>>> varDb = [None]*len(labels)
>>> varDb
[None, None, None, None]

然后您可以像其他列表一样对其进行索引


另一个问题是在 canvas 中使用 .place() 会将其放置在屏幕上而不是 canvas space 本身,为此您需要调用 canvas.create_window 所以这一行:

listsDd[i].place(x=70,y=10+(30*i))

将翻译为:

canvas.create_window(70, 10+(30*i), window = listsDd[i])