如何暂时屏蔽 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()
我想在加载某些内容时暂时阻止所有触摸功能,例如,当它从数据库中获取一些详细信息时我添加了一个 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()