Обеспечение доступа к событию TextInput on_text_validate из другого виджета - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь создать собственный виджет как модуль. Мой пользовательский виджет включает TextInput и некоторые другие вещи внутри виджета FloatLayout.

Когда я импортирую свой пользовательский виджет, я хочу использовать событие on_text_validate для TextInput внутри Floatlayout.

Как вы знаете, мы можем добавить поведение кнопки к любому виджету через класс ButtonBehavior, но я не смог найти способ добавить событие on_text_validate в мой пользовательский виджет.

Это мой модуль с именем mymodule.py внутри папки моего проекта.

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
#from kivy.uix.behaviors import FocusBehavior

Builder.load_string("""

<SearchBar>:
    id: search_bar
    size_hint: 1,.1
    pos_hint: {'top':1}
    canvas:
        Color:
            rgba: 1,1,1,1
        Rectangle:
            pos: self.pos
            size: self.size     

    TextInput:
        id: input
        hint_text: 'search'
        size_hint: .82,None
        height: dp(33)
        pos_hint: {'center_x':.565,'center_y': .5}
        multiline: False
        padding_y: [self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 0]
        padding_x: 20,150
""")

class SearchBar(FloatLayout):
    pass 

Я называю это из main.py как

#:import SearchBar mymodule.SearchBar

И это мой main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

Builder.load_string("""
#:import SearchBar mymodule.SearchBar

<MyTest>: 
    SearchBar:
        id: search
        size_hint: 1,.1

#       on_text_validate: root.do_something()

""")
class MyTest(FloatLayout):

    def do_something(self,*args):
        print('done')

class Test(App):
    def build(self):
        return MyTest()
Test().run()

1 Ответ

0 голосов
/ 04 ноября 2018

Возможное решение - создать событие с тем же именем и выстрелить в него с событием TextInput:

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder

Builder.load_string("""

<SearchBar>:
    id: search_bar
    size_hint: 1,.1
    pos_hint: {'top':1}
    canvas:
        Color:
            rgba: 1,1,1,1
        Rectangle:
            pos: self.pos
            size: self.size     

    TextInput:
        id: input
        hint_text: 'search'
        size_hint: .82,None
        height: dp(33)
        pos_hint: {'center_x':.565,'center_y': .5}
        multiline: False
        padding_y: [self.height / 2.0 - (self.line_height / 2.0) * len(self._lines), 0]
        padding_x: 20,150
        on_text_validate: root.dispatch('on_text_validate', *args)
""")

class SearchBar(FloatLayout):
    def __init__(self, **kwargs):
        super(SearchBar, self).__init__(**kwargs)
        self.register_event_type('on_text_validate')

    def on_text_validate(self, *args):
        pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...