Kivy DropDown Списки с использованием итерации - PullRequest
2 голосов
/ 02 июля 2019

Я пытаюсь создать несколько раскрывающихся списков, каждый из которых содержит одни и те же данные, но будет использоваться в качестве разных переменных. В настоящее время мой код будет генерировать все выпадающие списки. Хотя каждый раз, когда я пытаюсь изменить значение в любом из раскрывающихся списков, это значение будет назначено самому последнему раскрывающемуся списку вместо того, где оно было открыто.

Я начал с того, что не использовал никаких списков, а затем код работал правильно, но он был просто очень неэффективным. Таким образом, я хотел сократить повторяющиеся части и сформировать несколько списков. Я поигрался с разными «лямбда-выражениями» и считаю, что ошибка кроется в 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])

Ожидаемое: При выборе значения из любого из раскрывающихся списков ему следует присвоить его соответствующей «кнопке»

Фактические результаты: При выборе значения из любого из раскрывающихся списков значение присваивается самой последней кнопке. Смотрите эти изображения для лучшей иллюстрации:

Все выпадающие списки

All Dropdown Lists

Назначено в неправильном месте

Assigned to wrong place

1 Ответ

0 голосов
/ 02 июля 2019

Решение - создать основные кнопки и связать их с событием on_release, чтобы создать, заполнить и открыть список DropDown.

main.py

from kivy.base import runTouchApp
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

default_list = ['Python', 'Kivy', 'Tkinter']
first_row = ['abc', 'def', 'ghi', 'jkl']


col_found = GridLayout(cols=1)


def show_dropdown(button, *largs):
    dp = DropDown()
    dp.bind(on_select=lambda instance, x: setattr(button, 'text', x))

    for i in range(len(first_row)):
        item = Button(text=str(first_row[i]) + '%d' % i, size_hint_y=None, height=24, color=(1, 1, 1, 1))
        item.bind(on_release=lambda btn: dp.select(btn.text))
        dp.add_widget(item)
    dp.open(button)


for i in range(len(default_list)):
    btn = Button(text=default_list[i], color=(1, 1, 1, 1), size_hint=(None, None))
    btn.bind(on_release=show_dropdown)
    col_found.add_widget(btn)


runTouchApp(col_found)

выход

App Startup Clicked Kivy Button Kivy text replaced with text from selected dropdown list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...