Найти - Пользователи
Полная версия: Kivy, как вызвать обработчик on_active из динамических классов определенных в kv
Начало » GUI » Kivy, как вызвать обработчик on_active из динамических классов определенных в kv
1
Lisergin
Туплю чет. В .kv файле определяю виджет:
 <RBCapted@GridLayout>
    rb_capt: ''
    rb_group: ''
    Label:
        id: lb
        ...
    CheckBox:
        id: cb
        on_active: print(root.rb_group, root.rb_capt)
        ...
 <MainForm>
    orientation: 'vertical'
    padding: 10
    Button:
        text: 'upper space'
        size_hint_y: .2
    RBCapted:
        rb_capt: 'Option A'
        rb_group: 'gr1'
    RBCapted:
        rb_capt: 'Option B'
        rb_group: 'gr1'
        ...
В таком виде on_active работает для всех переключателей, но не соображу, как вставить на его место свой обработчик. Пишу on_active: root.rb_chg(root.rb_group, root.rb_capt), а в .ру файле .
 class MainForm(BoxLayout):
    def rb_chg(self, grp, butt):
        print(f'{grp}: {butt}')
Получаю ошибку
 AttributeError: 'RBCapted' object has no attribute 'grp_chg'
Подскажите, плз, как это делается.
Уточнил задачку
Lisergin
Ок, поставлю вопрос по другому.
На данный момент решил так:
 <MainForm>
    ...
    rb_gr_inpsys: gr1
    rb_gr_outsys: gr2
    Button:
       ...
    GridLayout:
        cols: 2
        RBGroup:
            id: gr1
            grp: 'grp1'
        RBGroup:
            id: gr2
            grp: 'grp2'
    Button:
        ...
<RBGroup@GridLayout+Border>
    rows: 4
    grp: ''
    RBCapted:
        rb_capt: 'Option A'
        group: root.grp
    ...
    RBCapted:
        rb_capt: 'Option D'
        group: root.grp
<RBCapted>
    rb_capt: ''
    group: ''
    active: False
    ...
    Label:
        id: lb
        text: root.rb_capt
        ...
    CheckBox:
        id: cb
        size_hint_y: None
        group: root.group
        allow_no_selection: False
        on_active: root.grp_chg(root.group, root.rb_capt)
        active: root.active
И собственно в .ру
 class RBCapted(GridLayout):
    def grp_chg(self, grp, butt):
        if self.ids.cb.active:
            MainForm.on_gr1(self, grp, butt)
class MainForm(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    def on_gr1(self, instance, value):
        print(f'{self} -- {instance}: {value}')
И такой ход как-то совсем не нравится, мож потому, что опыта маловато. А можно как-то по-другому, так чтоб обработчик работал сразу из класса с главным окном?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB