繁体   English   中英

在 kivy 中,如何在单个自定义小部件中分离多个按钮的 on_release?

[英]In kivy, how do I separate the on_release of multiple buttons in a single custom widget?

我在我的 kv 文件中定义了一个带有多个名为 SplitButton 的按钮的自定义小部件。 我可以在自定义小部件声明中每个按钮的on_release中硬编码 function 或调用 function。 但我想要做的是在其声明之外访问每个按钮的单独 on_release,这样一旦我将 SplitButton 放在根小部件上,我实际上可以将书面 function 传递到任一按钮的 on_release。

例如:假设小部件包含一个左按钮和一个右按钮。 除了访问 on_release,也许有一种方法可以访问名为 lb_on_release 和 rb_on_release 的东西? 希望这个简短的代码能够显示目标。

'''
<SplitButton>:
    Button:
        text: root.lb_text
        on_release: root.lb_on_release() # What should go here?
    Button:
        text: root.rb_text
        on_release: rb_on_release() # What should go here?

<Container>:
    SplitButton:
        rb_text: 'Right button'
        lb_text: 'Left button'
        rb_on_release: print('Right button has been pressed') # What I am trying to do
        lb_on_release: root.print_something() # What I am trying to do
'''

class Container(BoxLayout):
    pass

class SplitButton(BoxLayout):
    lb_text = StringProperty('')
    rb_text = StringProperty('')
    # What do I do for lb_on_release and rb_on_release?

    def print_something(self):
        print('Left button has been pressed')

我已经能够使用属性来做到这一点,这样我就可以在其声明之外更改每个按钮的 size_hint、background_color、文本等。 我只是有这个问题。 任何信息将不胜感激。

你可以用on_release方法做一个非常相似的事情,就像你用text做的一样。 您可以在SplitButton中添加ObjectProperty以保存对要在on_release中调用的方法的引用。 这是执行此操作的代码的修改版本:

'''
<SplitButton>:
    Button:
        text: root.lb_text
        on_release: root.lb_on_release()  # the () means actually call the indicated method
    Button:
        text: root.rb_text
        on_release: root.rb_on_release()

<Container>:
    SplitButton:
        rb_text: 'Right button'
        lb_text: 'Left button'
        rb_on_release: root.print_something  # this just sets rb_on_release to refer to the root.print_something method
        lb_on_release: self.print_something
'''

class Container(BoxLayout):
    def print_something(self, *args):
        print('root.print_something')

class SplitButton(BoxLayout):
    lb_text = StringProperty('')
    rb_text = StringProperty('')
    rb_on_release = ObjectProperty()  # ObjectProperty to hold reference to the method that should be called on release
    lb_on_release = ObjectProperty()

    def print_something(self):
        print('Left button has been pressed')

实际上,您甚至不需要在 python 代码中显式创建ObjectProperty ,因为 kivy 会根据kv代码为您创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM