How can I make a lot of buttons at dynamic in kv language?

前端 未结 3 1806
终归单人心
终归单人心 2020-12-07 03:03

I want to make a lot of Buttons at dynamic in kv language. But now I cannot...... I will show now source under this.


BoxLayout:
    orientation: \'vert         


        
相关标签:
3条回答
  • 2020-12-07 03:22

    This is false, you can easily integrate a loop in your KV file , like this :

        GridLayout:
        pos: root.pos
        size: root.size
        cols:30
        rows:3
        on_parent:
            for i in range(10): strId = "B{0}".format(i+1); i=Button(text=strId, id=strId, on_press=lambda BingoMain:root.my_Function(strId)); self.add_widget(i);
    
    0 讨论(0)
  • 2020-12-07 03:39

    Such loops aren't possible in kv language, other than doing some dirty hacks.

    To create a set of buttons dynamically, either use ListView or add them in a loop inside a py file.

    Example:

    from functools import partial
    
    class MyGrid(GridLayout):
        def __init__(self, **kwargs):
            super(MyGrid, self).__init__(**kwargs)
            self.add_buttons()
    
        def add_buttons(self):
            for i in xrange(5):
                button = Button(
                    text='X' + str(i),
                    on_press=partial(self.X, number=i)
                )
                self.add_widget(button)
    
        def X(self, caller, number):
            print  caller, number
    
    0 讨论(0)
  • 2020-12-07 03:48

    I don't think this can be done in an kv file. However, if you can write the kv string in your python file, you can do something like this:

    from kivy.app import App
    from kivy.lang import Builder
    
    kv_string = """
    BoxLayout:
        orientation: 'vertical'
        pos: root.pos
        size: root.size
    
        GridLayout:
            rows: 2
            spacing: 5
            padding: 5
    """ + ''.join(["""
            Button:
                text: "X{0}"
                on_press: root.X({0})
    """.format(i) for i in range(6)])
    
    class MyApp(App):
        def build(self):
            w = Builder.load_string(kv_string)
            return w
    
    if __name__ == '__main__':
        MyApp().run()
    
    0 讨论(0)
提交回复
热议问题