динамическое связывание функций, не работающих в киве - PullRequest
0 голосов
/ 03 мая 2018

Я хотел создать динамический класс для группы виджетов, поэтому всякий раз, когда я добавлял их в свое основное приложение, мне приходилось только вносить изменения откуда-то (например, файл Python, класс и т. Д., Здесь я их сделал в явных списках), но привязка виджета к таким свойствам, как «on_text», которые отвечают на события, на самом деле не работала, другие свойства, такие как «text», «hint_text», работали отлично, но on_text на самом деле не сдвинулся с места. Я не могу выяснить причину этого, потому что я проверил правильный объект, передаваемый по функциям, ниже мой код:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty



class Dynamic_TextInput(BoxLayout):
    def __init__(self,changes=None, **kwargs):
        super().__init__(**kwargs)
        self.widgets = {'Mylabel':self.ids.mylabel,
                        'Myinput': self.ids.mytext}
        self.Change(changes)


    def Change(self, changes=None, **kwargs):
        if changes: 
            for change in changes:
                curwidget = self.widgets[change[0]]
                cur_properties = change[1]
                for attr in cur_properties.keys():
                    if attr=='bind':
                        print("The cur properties are: ")
                        print(cur_properties[attr])
                        curwidget.bind(**(cur_properties[attr]))
                    else: 
                        setattr(curwidget, attr, cur_properties[attr])  



class mainwidget(BoxLayout):
    myobj1 = ObjectProperty()
    myobj2 = ObjectProperty() 
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'


        change1=[('Mylabel', {'text':'firstchange',
            'bind':{'on_text':lambda *_: print('something')}
            }),
                    ('Myinput', {'hint_text': 'Changed hint text'})
                ]

        self.add_widget(Dynamic_TextInput(changes=change1))
        self.add_widget(Dynamic_TextInput())


class MainApp(App):
    def build(self):
        return mainwidget()


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

И, в файле kivy:

#:kivy 1.10.0


<Dynamic_TextInput>:
    myobj1: mylabel
    myobj2: mytext
    orientation: 'horizontal'
    Label:
        id: mylabel
        text: 'testlable'
    TextInput:
        id: mytext
        hint_text: 'some test'   

В чем причина? И как я могу это исправить?

1 Ответ

0 голосов
/ 03 мая 2018

Существует 2 способа связывания свойства:

*. Py

object.bind(property=callback)

*. Киловольт

object:
    on_property: callback    

Так что в случае установки соединения в python вы не должны использовать on_text, но text.

Чтобы проверить изменение, Метка не может быть отредактирована из GUI, поэтому я буду использовать TextInput для записи в Label:

*. Py

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ObjectProperty


class Dynamic_TextInput(BoxLayout):
    def __init__(self,changes=None, **kwargs):
        super().__init__(**kwargs)
        self.widgets = {'Mylabel':self.ids.mylabel,
                        'Myinput': self.ids.mytext}
        self.Change(changes)


    def Change(self, changes=None, **kwargs):
        if changes: 
            for change in changes:
                curwidget = self.widgets[change[0]]
                cur_properties = change[1]
                for attr in cur_properties.keys():
                    if attr=='bind':
                        print("The cur properties are: ")
                        curwidget.bind(**(cur_properties[attr]))
                        print(cur_properties[attr])
                    else: 
                        setattr(curwidget, attr, cur_properties[attr])  


class mainwidget(BoxLayout):
    myobj1 = ObjectProperty()
    myobj2 = ObjectProperty() 
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'


        change1=[('Mylabel', {'text':'firstchange',
            'bind':{'text':lambda *_: print('something')}
            }),
                    ('Myinput', {'hint_text': 'Changed hint text'})
                ]

        self.add_widget(Dynamic_TextInput(changes=change1))
        self.add_widget(Dynamic_TextInput())


class MainApp(App):
    def build(self):
        return mainwidget()


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

*. Киловольт

#:kivy 1.10.0


<Dynamic_TextInput>:
    myobj1: mylabel
    myobj2: mytext
    orientation: 'horizontal'
    Label:
        id: mylabel
        text: mytext.text # <----
    TextInput:
        id: mytext
        hint_text: 'some test'   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...