使用 for 循环创建 Optionmenu
Create Optionmenu with for loop
我对 Python 以及一般的编码都很陌生。
我在列表中存储了 42 个标签(字符串)。
我的目标是:对于 42 个标签中的每一个,创建一个显示字符串的 Tkinter 标签和一个下拉列表(Tkinter Optionmenu)。
出现两个问题:
- 我收到变量列表的索引错误(对于选项菜单),这是我的控制台的输出:
varDd[i] = StringVar(root)
IndexError: list assignment index out of range
- 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)
第一个问题是这样产生的:
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])
我对 Python 以及一般的编码都很陌生。
我在列表中存储了 42 个标签(字符串)。 我的目标是:对于 42 个标签中的每一个,创建一个显示字符串的 Tkinter 标签和一个下拉列表(Tkinter Optionmenu)。
出现两个问题:
- 我收到变量列表的索引错误(对于选项菜单),这是我的控制台的输出:
varDd[i] = StringVar(root) IndexError: list assignment index out of range
- 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)
第一个问题是这样产生的:
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])