Я столкнулся с ошибкой при попытке получить доступ к двум кнопкам из группы кнопок, созданной в цикле for и привязав кнопку к on_press. Пожалуйста, как правильно это сделать (без .kv). Как я могу получить доступ к отдельной кнопке и привязать их к другому событию on_press

from kivy.app import App
from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout

class TestApp(App): 
        def build(self):
               layout=GridLayout(cols=1)
               for i in range(6): 
                    btn = Button(text= str(i)) 
                    layout.add_widget(btn)

# error occurred here      
              btn[0].bind(on_press=first)
              btn[1].bind(on_press=second)

         def first(self):
             pass
         def second(self):
             pass

              return layout

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

0
Mayorexz 29 Июл 2020 в 12:09

2 ответа

Лучший ответ

Код, включающий btn[0], подразумевает список btn, но в вашем коде такого списка нет. Вот модифицированная версия вашего кода, которая делает то, что вы хотите:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout

class TestApp(App):
    def build(self):
        layout=GridLayout(cols=1)
        for i in range(6):
            btn = Button(text= str(i))
            layout.add_widget(btn)
            if i == 0:
                btn.bind(on_press=self.first)
            elif i == 1:
                btn.bind(on_press=self.second)
        return layout


    def first(self, button_instance):
        print('first')
        
    def second(self, button_instance):
        print('second')


if __name__ == '__main__':
    TestApp().run()
0
John Anderson 29 Июл 2020 в 13:28

Я все еще не решил полностью свою проблему, однако следующий код вернул объект, созданный на кнопке, и присвоенное ему значение. Поэтому я считаю, что это решение может вам помочь.

from functools import partial

for x in test:
    btn = Button(text=x["CustomerName"], background_color=[0.9, 0.9, 0.9, 0.9], size_hint_y=None, height=40)
    btn.bind(on_press=partial(self.mostra,x["CustomerName"]))
    self.ids.grd1.add_widget(btn)

def mostra(self,*args):
    print(args)

Глядя на опубликованный мной код, я использовал bind после создания кнопки (btn.bind), и в нем я передал функцию, которая показывает на экране значение, сохраненное в x моего цикла. В функции (mostra) использование self и * args обязательно.

В начале есть строка (from functools import partial), которая необходима для выполнения функции show внутри привязки.

0
Ruli 8 Окт 2020 в 11:26