Kivy:如何将背景触摸与小部件触摸分开?

Mad*_*Air 2 python kivy

在我的应用程序中,我想分别处理背景触摸和小部件触摸。该控件文件忽略如何防止.kv事件冒泡。这是一个小测试用例:

from kivy.app import App

class TestApp(App):

  def on_background_touch(self):
    print("Background Touched")
    return True

  def on_button_touch(self):
    print("Button Touched")

if __name__ == "__main__":
  TestApp().run()
Run Code Online (Sandbox Code Playgroud)

和.kv:

#:kivy 1.8.0

BoxLayout:
  orientation: "vertical"
  on_touch_down: app.on_background_touch()
  padding: 50, 50

  Button:
    text: "Touch me!"
    on_touch_down: app.on_button_touch()
Run Code Online (Sandbox Code Playgroud)

结果:触摸背景或按钮会触发两个处理程序。我应该执行碰撞检测,还是有其他方法?

inc*_*ent 5

您应该执行碰撞检测。例如,在类定义中:

class YourWidget(SomeWidget):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            do_stuff()
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,您的方法无论如何都不起作用,因为 Button 与 BoxLayout 重叠。我可能会改为创建一个 BoxLayout 子类并覆盖 on_touch_down,首先调用 super,然后如果它返回 False(表示尚未使用触摸)进行 BoxLayout 交互。