【问题标题】:Making TextInput on_text_validate event accessible from another widget使 TextInput on_text_validate 事件可从另一个小部件访问
【发布时间】:2018-11-04 20:22:13
【问题描述】:

我正在尝试将自定义小部件创建为模块。我的自定义小部件在 FloatLayout 小部件中包含 TextInput 和其他一些内容。

当我导入自定义小部件时,我想在 Floatlayout 中为 TextInput 使用 on_text_validate 事件。

如您所知,我们可以通过 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()

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    一种可能的解决方案是创建一个具有相同名称的事件并使用 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
    

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多