按钮' on_release'活动电话' on_touch_up'每个动态创建标签的事件

时间:2014-11-20 19:25:31

标签: python-2.7 kivy

在我的应用程序中,我想在触摸其中一个动态创建的标签时调用某个函数。并且底部有一个按钮可以调用另一个功能。但是当我按下按钮时,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    
将按下

按钮和此按钮后面的标签。 我该如何妥善处理这种触摸?

1 个答案:

答案 0 :(得分:0)

这是因为您绑定到on_touch_upon_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用于更高级用法。