KivyMD中MDSlider的on_touch_up点击任意屏幕位置触发及点击滑块触发两次问题
KivyMD MDSlider on_touch_up 异常修复方案
异常原因
- 点击非Slider区域触发事件:Kivy 触摸事件采用全局广播分发机制,
on_touch_up是通用触摸事件,所有绑定该事件的控件默认会收到全局的触摸抬起通知,不会自动限制仅在触摸本控件时触发。 - 点击Slider触发两次:MDSlider在
on_touch_down阶段会主动抓取触摸事件(grab)保证滑动过程事件不丢失,触摸抬起时会先后收到两次on_touch_up通知:一次是全局事件分发,一次是抓取事件的定向分发。
修复方案
方案1:调整原有on_touch_up逻辑
在回调方法中增加触摸归属判断,过滤不属于当前控件的事件:
def get_slider_value(self, obj, touch): # 仅处理当前控件抓取到的、落在控件范围内的触摸事件 if touch.grab_current is obj and obj.collide_point(*touch.pos): print(obj.value) return True return False
方案2:更推荐的原生事件实现
无需绑定通用触摸事件,直接使用MDSlider原生提供的on_release事件,该事件仅当用户在Slider上完成触摸/滑动抬起时触发,天然规避上述两个异常:
- 替换绑定逻辑:
将原有绑定代码
self.slider.bind(on_touch_up = self.get_slider_value)
替换为
self.slider.bind(on_release = self.get_slider_value)
- 回调方法无需额外判断:
def get_slider_value(self, obj, *args): print(obj.value)
内容的提问来源于stack exchange,提问作者Daniel Chettiar
相关产品推荐
相关产品推荐

