Создать Optionmenu с для цикла
Я довольно новичок в Python, а также программирование в целом.
У меня есть 42 метки (строки), хранящиеся в списке. Моя цель состоит в том, чтобы: для каждой из 42 меток создать метку Tkinter, отображающую строку и выпадающий список (Tkinter Optionmenu).
Возникают две проблемы:
- Я получаю ошибку индекса для списка переменных (для опционных меню), вот вывод моей Консоли:
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 ответ
Первая проблема возникает из этого как:
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])