[英]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.