首页 > 解决方案 > 为什么即使我们创建了多个小部件,自定义小部件的绑定也会占据所有焦点?

问题描述

我想创建 2 个标签,我可以在其中触发一个事件,并使用我双击的标签 shen 的名称执行操作。

我找到并且正在使用的解决方案

问题:当我双击任意位置时,我创建/提供绑定的最后一个自定义小部件是触发器。所以它在小部件范围之外工作,所以它不是所需的功能。


from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout

class ClickableLabel(Label):
    def __init__(self, **kwargs):
        Label.__init__(self, **kwargs)
        self.register_event_type('on_double_press')
        if kwargs.get("on_double_press") is not None:
            self.bind(on_double_press=kwargs.get("on_double_press"))

    def on_touch_down(self, touch):
        if touch.is_double_tap:
            self.dispatch('on_double_press', touch)
            print(self.text)
            return True
        return Label.on_touch_down(self, touch)

    def on_double_press(self, *args):
        pass


class MyApp(App):
    def build(self):
        boxlayout = BoxLayout()

        label = ClickableLabel(text='Hello world', on_double_press=self.callback)
        boxlayout.add_widget(label)
        label_2 = ClickableLabel(text="it's Boby", on_double_press=self.callback)
        boxlayout.add_widget(label_2)
        return boxlayout

    def callback(self, *args):
        print("double clicked", args[0])


if __name__ == '__main__':
    MyApp().run()

编辑:这是一个可聚焦布局的工作示例。

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.boxlayout import BoxLayout

class ClickableBoxLayout(ButtonBehavior, BoxLayout):
    pass

class Line(ClickableBoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.idx = 0

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.idx += 1
            print(self.idx)

class MyApp(App):
    def build(self):
        b = BoxLayout()
        c_1 = Line()
        b.add_widget(c_1)
        c_2 = Line()
        b.add_widget(c_2)

        c_1.add_widget(Label(text="Hello"))
        c_2.add_widget(Label(text="World"))
        return b

MyApp().run()

标签: pythonbindingkivy

解决方案


您需要使用collide_point()来确定touch事件是否发生在您的ClickableLabel.

请参阅文档


推荐阅读