Получить текст кнопки через список Python рекурсивно - PullRequest
0 голосов
/ 09 января 2019

У меня есть DropDown со многими кнопками и список со многими строками, поэтому каждый текст из кнопок должен быть строками из списка (у button1 есть первая строка из списка, button2 - строка секунд и т. Д. Проблема в том, что все тексты моих кнопок имеют только последнюю строку из списка.

Я в основном пытался сделать простой цикл, где я перебираю список и устанавливаю результат в StringProperty, и помещаю StringProperty в «текст» из кнопки в файле kv.

.py:

# Here is the list
clientes = ['Sercom', 'Lideranca', 'Winover']



class MyScreenManager(ScreenManager):
    button_text = StringProperty('Clients')

    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)
        self.dropdown = CustomDropDown1(self)

    def open_drop_down(self, widget):
        self.dropdown.open(widget)

class MyScreen(Screen):
    def __init__(self, **kwargs):
        super(MyScreen, self).__init__(**kwargs)



class CustomDropDown1(DropDown):
    client_text = StringProperty()

    def __init__(self, screen_manager, **kwargs):
        super(CustomDropDown1, self).__init__(**kwargs)
        self.sm = screen_manager
        self.is2Displayed = False

        # Here is my loop
        for message in clientes: 
            self.client_text = message



class GuiApp(App):
    def build(self):
        return MyScreenManager()

if __name__ == '__main__':
    GuiApp().run()

.kv:

<MyScreenManager>:
    MyScreen:
        FloatLayout:
            Button:
                text: root.button_text
                size: (200, 50)
                size_hint:(None,None)
                pos_hint: {'center_x': 0.5, 'top': 1.0}
                on_release: root.open_drop_down(self)

<CustomDropDown1>:
    padding: [0,0,0,0]
    Button:
        text: root.client_text
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)
    Button:
        text: root.client_text
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)

В моем случае текст с первой кнопки должен быть «Sercom», вторая кнопка должна быть «Lideranca», а третья кнопка «Winover».

но текст со всех кнопок "Winover"

1 Ответ

0 голосов
/ 10 января 2019

Так как текст вашей кнопки не изменится, вам не нужно client_text StringProperty. StringProperty отлично подходит, если вам нужно изменить текст Button или Label, но здесь нет необходимости.

Есть несколько способов выполнить то, что вы хотите. Вот моя первая мысль, используя список clientes напрямую. Я переместил список clientes в класс CustomDropDown1, поскольку именно там он используется.

class CustomDropDown1(DropDown):
    clientes = ['Sercom', 'Lideranca', 'Winover']

    def __init__(self, screen_manager, **kwargs):
        super(CustomDropDown1, self).__init__(**kwargs)
        self.sm = screen_manager
        self.is2Displayed = False

        for button_num in range(2):
            id = 'button' + str(button_num)
            self.ids[id].text = self.clientes[button_num]

Я также добавил идентификаторы к вашим кнопкам и удалил свойства text: в файле kv:

<CustomDropDown1>:
    padding: [0,0,0,0]
    Button:
        id: button0
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)
    Button:
        id: button1
        size:(200,50)
        size_hint:(None,None)
        text_size: self.size
        valign: 'center'
        padding: (10,0)
        on_release: root.select(self.text)

Таким образом, каждая кнопка имеет id вида 'button #', где '#' - номер кнопки, затем цикл в методе __init__() CustomDropDown1 создает идентификатор кнопки на основе номера и устанавливает текст, используя номер в качестве индекса в списке clientes.

Другой подход - полностью исключить цикл и просто установить текст кнопки как

.
text: root.clientes[0]

для первой кнопки и

text: root.clientes[1]

для следующего и т. Д. (Со списком clientes в классе CustomDropDown1).

...