0

I am using kivy as my GUI tools for my python program. when I want to create a table,in which there is a column containing dropdown list to make select value easier. However, I can not make it works correctly. The following is my code.

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

sel =["A","B","C"]

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.redraw()

    def redraw(self):

        self.clear_widgets()
        self.rows = 5
        self.cols =2

        for i in range(5):

            label = Label(text="cell"+str(i+1))
            self.add_widget(label)

            drpName = DropDown()
            btnName = Button(text="B",size_hint=(None, None))
            for e in sel:
                btn=Button(text=e, size_hint_y=None, height=btnName.height)
                btn.bind(on_release=lambda btn:drpName.select(btn.text))
                drpName.add_widget(btn)
            btnName.bind(on_release=drpName.open)
            drpName.bind(on_select=lambda instance, x: setattr(btnName, 'text', x))
            self.add_widget(btnName)

class testApp(App):
    def build(self):
        return MyGrid()

if __name__=="__main__":
    testApp().run()

Only a part of button open the pull down list and all of the selected value will replace the text of last button. Could you help me out. Thanks in advance.

Jilong Yin
  • 278
  • 1
  • 3
  • 15

1 Answers1

0

After reading post Python Lambda in a loop[Building Dropdowns Dynamically in Kivy, I can make my program works.

Thanks for valuable post.

import kivy
kivy.require('1.10.0')

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.gridlayout import GridLayout

sel =["A","B","C"]

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.redraw()

    def redraw(self):

        self.clear_widgets()
        self.rows = 5
        self.cols =2

        drpName = []

        for i in range(5):

            label = Label(text="cell"+str(i+1))
            self.add_widget(label)

            drpName.append(DropDown())
            btnName=Button(text="B",size_hint=(None, None))
            for e in sel:
                btn=Button(text=e, size_hint_y=None, height=btnName.height)
                btn.bind(on_release=lambda btn=btn,dropdown=drpName[i]:dropdown.select(btn.text))
                drpName[i].add_widget(btn)
            btnName.bind(on_release=drpName[i].open)
            drpName[i].bind(on_select=lambda instance, x,btn=btnName: setattr(btn, 'text', x))
            self.add_widget(btnName)

class testApp(App):
    def build(self):
        return MyGrid()

if __name__=="__main__":
    testApp().run()
Jilong Yin
  • 278
  • 1
  • 3
  • 15