es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Kivy: Cómo agregar botones a StackLayout desde una lista.

Quiero usar una lista de valores como ['btn1', 'btn2','btn3'] para crear botones dinámicamente en mi diseño (layout). Después de eso quiero capturar el nombre del botón cuando se presione, pero estoy atascado en el paso de añadir botones. Por favor, ayúdeme.
Este es mi archivo main.py:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.button import Button

Builder.load_file('design.kv')

class MyLayout(Widget):
    btns = ['btn1', 'btn2','btn3']
    for i in btns:
        self.add_widget(Button(text = i))

class MyApp(App):
    def build(self):
        return MyLayout()

if __name__ == "main":
     MyApp().run()

Y este es mi archivo design.kv:

“`
<mybutton@button>:
font_size: 24
size_hint: [.50, None]
height: 60

<mylayout>
GridLayout:
rows: 2
size: root.width, root.height
Label:
size_hint: 1, None
size: 120 , 120
text: "Welcome"
font_size: 42
rgb: utils.get_color_from_hex('#5ee2e5')

<pre><code> ScrollView:
do_scroll_x: False
do_scroll_y: True

StackLayout:
canvas:
Color:
rgb: utils.get_color_from_hex('#5ee2e5')
Rectangle:
pos: self.pos
size: self.size

cols:1
pos_hint: {'center_x':.5}
size_hint_y: None
spacing: 5
padding: 10
height: self.minimum_height
top: self.height

MyButton:
text: "Btn1"
</code></pre>

“`</mybutton@button>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para crear botones dinámicamente basados en una lista de valores, puedes inicializar una lista (btns) con los valores y recorrerla utilizando un bucle for. Luego, para cada artículo de la lista, puedes crear un widget de Button y agregarlo al diseño utilizando el método add_widget(). Para capturar el nombre del botón cuando se presiona, puedes vincular el evento on_press del botón a una función que recupera el texto del botón.

    Aquí hay una clase MyLayout actualizada que crea botones dinámicamente y captura el nombre del botón cuando se presiona:

    class MyLayout(Widget):
        btns = ['btn1', 'btn2', 'btn3']
    
        def __init__(self, **kwargs):
            super(MyLayout, self).__init__(**kwargs)
    
            layout = GridLayout(cols=1, spacing=5, size_hint_y=None)
            layout.bind(minimum_height=layout.setter('height'))
    
            for i in self.btns:
                button = Button(text=i)
                button.bind(on_press=self.on_button_press)
                layout.add_widget(button)
    
            scrollview = ScrollView(do_scroll_x=False, do_scroll_y=True)
            scrollview.add_widget(layout)
    
            self.add_widget(scrollview)
    
        def on_button_press(self, button):
            print(button.text)
    

    Aquí está el archivo main.py actualizado:

    from kivy.app import App
    from kivy.uix.widget import Widget
    
    Builder.load_file('design.kv')
    
    class MyLayout(Widget):
        # Implementación de MyLayout
    
    class MyApp(App):
        def build(self):
            return MyLayout()
    
    if __name__ == "__main__":
        MyApp().run()
    

    Y aquí está el archivo design.kv actualizado:

    <mybutton@button>:
        font_size: 24
        size_hint: [.50, None]
        height: 60
    
    <mylayout>
        GridLayout:
            rows: 2
            size: root.width, root.height
    
            Label:
                size_hint: 1, None
                size: 120 , 120
                text: "Bienvenido"
                font_size: 42
                rgb: utils.get_color_from_hex('#5ee2e5')
    
            # ScrollView y StackLayout eliminados
    

    Ten en cuenta que los widgets ScrollView y StackLayout se han eliminado del archivo design.kv, ya que han sido reemplazados por el GridLayout creado dinámicamente. La regla MyButton todavía está presente ya que se utiliza para dar estilo a los botones.</mybutton@button>

Comments are closed.