如何暂时屏蔽 Kivy 应用中的触摸功能?

How to block touch functions in Kivy app temporarily?

我想在加载某些内容时暂时阻止所有触摸功能,例如,当它从数据库中获取一些详细信息时我添加了一个 MDSpinner,那时我不希望我的用户在文本字段中键入或单击屏幕上的按钮。那么,我们该怎么做呢?

你可以这样做

from kivymd.app import MDApp

from kivy.lang.builder import Builder
from kivy.uix.modalview import ModalView
from kivy.properties import BooleanProperty
from kivy.clock import Clock

KV = """
<ModalViewSpinner>
    overlay_color: [0, 0, 0, 0.5]
    background_color: [0, 0, 0, 0]
    background: ''
    
    MDSpinner:
        size_hint: None, None
        size: dp(46), dp(46)
        pos_hint: {'center_x': .5, 'center_y': .5}
        active: root.active
        
Screen:
    MDRoundFlatButton:
        text: "Fetching details from database"
        pos_hint: {"center_x": .5, "center_y": .5}
        on_release: app.block_screen()
"""


class ModalViewSpinner(ModalView):
    active = BooleanProperty(False)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.bind(on_open=lambda *args: self.change_spinner_state(True),
                  on_dismiss=lambda *args: self.change_spinner_state(False)
                  )

    def change_spinner_state(self, state: bool):
        self.active = state


class TestApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.spinner_view = None

    def build(self):
        return Builder.load_string(KV)

    def block_screen(self):
        if not self.spinner_view:
            self.spinner_view = ModalViewSpinner()

        self.spinner_view.open()

        Clock.schedule_once(self.spinner_view.dismiss, 2.0)


TestApp().run()