通过python列表递归获取按钮文本

时间:2019-01-09 14:24:04

标签: python python-3.x kivy kivy-language

我有一个包含许多按钮的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 :(得分:0)

由于按钮文本不会更改,因此不需要client_text StringProperty。如果您需要更改StringPropertyButton的文本,那么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:

我还向您的按钮添加了ID,并删除了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的{​​{1}}方法中的循环将建立按钮id基于数字,并使用数字作为clientes列表的索引来设置文本。

另一种方法是完全消除循环,只需将按钮文本设置为

text: root.clientes[0]

第一个按钮,和

text: root.clientes[1]

接下来的内容,依此类推(以clientes类中的CustomDropDown1列表为例。