Python 其他小部件下面的Kivy小部件是可交互的,如何防止这种情况?

Python 其他小部件下面的Kivy小部件是可交互的,如何防止这种情况?,python,kivy,kivy-language,Python,Kivy,Kivy Language,考虑一个应用程序,它包含一个RelativeLayout中的按钮。如果除按钮外的任何小部件被放置在其顶部,从而隐藏了按钮,则此按钮和RelativeLayout的任何其他子项将可交互,即使它不可见 可以采取哪些措施来强制实现此功能 下面是一个例子:请注意,尽管完全隐藏,但应用程序中心的按钮仍然接收触摸事件: from kivy.app import App from kivy.uix.relativelayout import RelativeLayout from kivy.uix.butto

考虑一个应用程序,它包含一个
RelativeLayout
中的按钮。如果除按钮外的任何小部件被放置在其顶部,从而隐藏了按钮,则此按钮和
RelativeLayout
的任何其他子项将可交互,即使它不可见

可以采取哪些措施来强制实现此功能

下面是一个例子:请注意,尽管完全隐藏,但应用程序中心的按钮仍然接收触摸事件:

from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
from kivy.graphics import *
from kivy.core.window import Window
from kivy.uix.widget import Widget


class MyApp(App):
    def build(self):
        
        def btn_pressed(instance):
            print('ok')
        
        root = RelativeLayout()
        button = Button()
        root.add_widget(button)
        
        button.size_hint = (None, None)
        button.pos_hint = {'center_x': 0.5, 'center_y': 0.5}
        button.bind(on_press=btn_pressed)
        
        layout = RelativeLayout()
        with layout.canvas:
            Color(0,0,0,1)
            Rectangle(size=(Window.size[0], Window.size[1]))
        
        root.add_widget(layout)
        
        return root

MyApp().run() ```

大多数小部件的默认行为是允许继续调度触摸事件。这由\u touch\u XXX()上的
方法的返回值控制。返回的
True
表示“不继续调度”,返回的
False
表示“继续调度”。因此,您可以通过定义一个停止调度的自定义类来停止touch\u down
事件的调度。例如:

class MyTouchBlocker(RelativeLayout):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            return True
        else:
            return super(MyTouchBlocker, self).on_touch_down(touch)
在代码中,您可以替换:

layout = RelativeLayout()
与:

layout = MyTouchBlocker()