在我的应用程序中,我想分别处理背景触摸和小部件触摸。该控件文件忽略如何防止.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)
结果:触摸背景或按钮会触发两个处理程序。我应该执行碰撞检测,还是有其他方法?
您应该执行碰撞检测。例如,在类定义中:
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 交互。