Я пытаюсь создать несколько раскрывающихся списков, каждый из которых содержит одни и те же данные, но будет использоваться в качестве разных переменных. В настоящее время мой код будет генерировать все выпадающие списки. Хотя каждый раз, когда я пытаюсь изменить значение в любом из раскрывающихся списков, это значение будет назначено самому последнему раскрывающемуся списку вместо того, где оно было открыто.
Я начал с того, что не использовал никаких списков, а затем код работал правильно, но он был просто очень неэффективным. Таким образом, я хотел сократить повторяющиеся части и сформировать несколько списков. Я поигрался с разными «лямбда-выражениями» и считаю, что ошибка кроется в btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text))
строке кода (я могу быть совершенно неправ). Я не уверен, правильно ли я настраиваю лямбда-функции с помощью кода, который я написал.
first_row
- это список данных из файла Excel.
default_list
список случайных строк
dropdown = [DropDown() for x in range (len(default_list))]
btn = [Button() for x in range (len(default_list))]
main_btn = [Button() for x in range (len(default_list))]
col_found = GridLayout(cols = 1)
## create buttons for dropdown lists with excel data
for index in range(0, len(first_row)):
for i in range (0, len(default_list)):
btn[i] = Button(text=str(first_row[index])+'%d'%i, size_hint_y=None, height=24, color = (1,1,1,1))
btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text))
dropdown[i].add_widget(btn[i])
## set up main buttons with dropdown lists and add them to the pop up
for i in range (0, len(default_list)):
main_btn[i] = Button(text = "default%d"%i, on_release=dropdown[i].open, color = (1,1,1,1))
dropdown[i].bind(on_select=lambda instance, x=dropdown[i]: setattr(main_btn[i], 'text', x))
col_found.add_widget(main_btn[i])
Ожидаемое:
При выборе значения из любого из раскрывающихся списков ему следует присвоить его соответствующей «кнопке»
Фактические результаты:
При выборе значения из любого из раскрывающихся списков значение присваивается самой последней кнопке. Смотрите эти изображения для лучшей иллюстрации:
Все выпадающие списки
Назначено в неправильном месте