在我的应用程序中,我想在触摸其中一个动态创建的标签时调用某个函数。并且底部有一个按钮可以调用另一个功能。但是当我按下按钮时,on_touch_up事件会调用每个标签:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.logger import Logger
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
Builder.load_string("""
<Root>:
BoxLayout:
orientation: 'vertical'
size_hint: 1, 1
ScrollView:
id: scroll_view
size_hint: 1,.9
do_scroll_x: False
BoxLayout:
orientation: 'horizontal'
size_hint: 1,.1
Button:
id: bt1
text: 'Click'
size_hint: 1,1
on_release: root.btn1_click()
""")
class Root(BoxLayout):
def btn1_click(self):
Logger.info('BUTTON: button was released')
class TestApp(App):
def callback(self, instance, touch):
#if not instance.collide_point(*touch.pos):
# return
Logger.info('LABEL: ' + instance.text + 'was released')
def build(self):
root = Root()
sv = root.ids.scroll_view
grid = GridLayout(cols=1, spacing=(0,10), size_hint_y=None,
padding = [10,10,10,10],row_force_default=True, row_default_height=50)
grid.bind(minimum_height=grid.setter('height'))
sv.add_widget(grid)
for tr in [i for i in range(50)]:
lb_text = str(tr) + ' ' + 'Label'
lb = Label(text=lb_text)
lb.bind(on_touch_up=self.callback)
grid.add_widget(lb)
return root
if __name__ == '__main__':
TestApp().run()
如果我使用:
#if not instance.collide_point(*touch.pos):
# return
将按下按钮和此按钮后面的标签。 我该如何妥善处理这种触摸?
答案 0 :(得分:0)
这是因为您绑定到on_touch_up
。 on_touch_down
事件已被触发,Button
抓住了这一点。因此,当您发布时,Button
将处理该事件,无论如何(即使触摸不再超过Button
)。
这就是我们ButtonBehavior
的原因。如果你使用这种行为,那么一切都很好:
from kivy.uix.behaviors import ButtonBehavior
class TouchLabel(ButtonBehavior, Label):
pass
然后当你添加标签时:
lb = TouchLabel(text=lb_text)
lb.bind(on_release=self.callback)
最后,on_release
的事件处理程序的签名与on_touch_down
不同:
def callback(self, instance):
Logger.info('LABEL: ' + instance.text + 'was released')
on_touch_down
/ on_touch_move
/ on_touch_up
用于更高级用法。