Создать 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])
Другие вопросы по тегам