несколько кивы выпадающий - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я пытаюсь написать простой код с использованием инфраструктуры kivy, мой код просматривает словарь на предмет определенного значения, которое сообщает моему коду на более позднем этапе, какие значения словаря должны быть выведены в виде выпадающего меню и какие Значения dict просто необходимо выводить как обычную метку и текстовый ввод. Теперь проблема заключается в том, что просматриваемый мной словарь описывает более одного значения, которое должно быть раскрывающимся. Я хочу, чтобы раскрывающийся список работал, когда в раскрывающемся списке выбрано значение, кнопка, которая вызывает раскрывающийся список, должна изменить текст на текст кнопки, на которой была нажата кнопка. Вот код, я решил написать более простую версию для читабельности. Я хотел напечатать это под кодом, но я действительно отстой в написании вопросов по стеку Over Flow. Код, который вы собираетесь просмотреть, создает две кнопки (которые вызывают раскрывающиеся списки), одну именованную группу 0 и другую именованную группу 1, однако, когда я нажимаю одну из раскрывающихся кнопок в группе 0, текстовый атрибут группы 1 изменяется, но Я хочу изменить текстовый атрибут кнопки группы 0. У меня есть репутация не иметь смысла, когда я объясняю, поэтому дайте мне знать, если вам нужна ясность, любая помощь будет оценена.

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

test_floatie = FloatLayout()
# We wanna create 2 button that trigger a drop down
i = 0

# The loop that creates the two buttons
while i < 2:

# Create a drop down
    dropdown = DropDown()
    for index in range(10):

        # Creating our button
        btn = Button(text="Button"+str(index), size_hint_y=None, height=44)

        # Sending button info to dropdown select function
        btn.bind(on_release=lambda btn: dropdown.select(btn.text))

        # Closing drop down after selection
        btn.bind(on_release=dropdown.dismiss)

        # Adding buttons to the drop down
        dropdown.add_widget(btn)

    # Simple if statement for positioning
    if i == 0:
        position = "left"
    else:
        position = "right"

    # The button that triggers the drop down
    dropButton = Button(text="Group"+str(i), size_hint=(0.4, 0.3), pos_hint={"top":1, position:1})
    print(dropButton)

    # Binding the button to a function that triggers the drop down 
    dropButton.bind(on_release=dropdown.open)

    # Using the drop down select function to change the text of the button that triggers the drop down
    dropdown.bind(on_select=lambda instance, x: setattr(dropButton, "text", x))

    test_floatie.add_widget(dropButton)

    i = i +1

# Running la app
class MainApp(App):
    def build(self):
        return test_floatie

MainApp().run()

1 Ответ

0 голосов
/ 29 апреля 2020

Немного упростил ваш код:

from functools import partial

test_floatie = FloatLayout()
# We wanna create 2 button that trigger a drop down


def select(drop_button, text, btn):
    drop_button.text = text


# The loop that creates the two buttons
for position in ["left", "right"]:
    # The button that triggers the drop down
    dropButton = Button(text="Group " + position, size_hint=(0.4, 0.3),
                        pos_hint={"top": 1, position: 1})

    # Create a drop down
    dropdown = DropDown()
    for index in range(10):
        # Creating our button
        btn = Button(text=position + str(index), size_hint_y=None, height=44)

        # Sending button info to dropdown select function
        # btn.bind(on_release=lambda btn: setattr(dropButton, "text", btn.text))
        # btn.bind(on_release=lambda btn: select(dropButton, btn.text, btn))
        btn.bind(on_release=partial(select, dropButton, btn.text))

        # Closing drop down after selection
        btn.bind(on_release=dropdown.dismiss)

        # Adding buttons to the drop down
        dropdown.add_widget(btn)

    # Binding the button to a function that triggers the drop down
    dropButton.bind(on_release=dropdown.open)

    test_floatie.add_widget(dropButton)


# Running la app
class MainApp(App):
    def build(self):
        return test_floatie


MainApp().run()

Обратите внимание на использование partial вместо закомментированного lambda.
Похоже, они сообщают одно и то же, но не t .. (см. здесь )

Если вы создаете обратные вызовы в al oop и используете переменную al oop в качестве аргумента для обратного вызова, то вам следует используйте partial. lambda оценивает переменную во время выполнения, тогда как partial оценивает, когда создается функция partial.

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