【问题标题】:Interference of Sliders in KivyKivy 中滑块的干扰
【发布时间】:2015-08-23 22:19:03
【问题描述】:

我正在学习 Kivy,目前正在尝试了解 Slider 类。我创建了两个滑块。滑块一应该只对 on_touch_move 作出反应,而滑块二应该对 on_touch_up 和 on_touch_down 作出反应。如果我实现这个,就像我在下面的示例中所做的那样,两个滑块都会相互干扰,即它们会对所有三个事件调度程序做出反应。我试图理解为什么会这样以及如何解决这个问题,但我做不到。谢谢你帮助我。

sliders.kv 文件:

#: kivy 1.9.0

SliderScreen:

<SliderScreen>:

    Slider:
        min: 0 
        max: 1
        value: 0.75
        step: 0.01
        on_touch_move: root.test_a()


    Slider:
        min: 0 
        max: 1
        value: 0.25
        step: 0.01
        on_touch_up: root.test_b()
        on_touch_down: root.test_c()

和 main.py:

import kivy
kivy.require('1.9.0')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.slider import Slider

class SliderScreen(BoxLayout):
    def test_a(self):
        print("test_a accessed")

    def test_b(self):
        print("test_b accessed")

    def test_c(self):
        print("test_c accessed")        

class SlidersApp(App):
    pass

if __name__ == '__main__':
    SlidersApp().run()  

【问题讨论】:

    标签: slider kivy


    【解决方案1】:

    on_touch_moveon_touch_upon_touch_down 事件由SliderScreen 类捕获,然后传播到其所有小部件。根据documentation

    默认情况下,触摸事件被调度到所有当前显示的 小部件。这意味着无论是否发生,小部件都会收到触摸事件 是否在他们的物理区域内。

    如果您有使用其他 GUI 的经验,这可能与直觉相反 工具包。这些通常将屏幕划分为几何区域和 如果坐标仅将触摸或鼠标事件发送到小部件 位于小部件区域内。

    在使用触控时,此要求变得非常严格 输入。滑动、捏合和长按很可能源自 在想要了解它们并对它们做出反应的小部件之外。

    为了提供最大的灵活性,Kivy 调度 所有小部件的事件,并让它们决定如何对它们做出反应。 如果您只想响应小部件内的触摸事件,您 只需检查:

    def on_touch_down(自我,触摸): 如果 self.collide_point(*touch.pos): # 触摸发生在小部件区域内。做东西! 经过

    因此你应该在你的代码中使用:

    Builder.load_string("""
    
    <SliderScreen>:
        Slider:
            min: 0 
            max: 1
            value: 0.75
            step: 0.01
            on_touch_move: if self.collide_point(*args[1].pos): root.test_a()
    
        Slider:
            min: 0 
            max: 1
            value: 0.25
            step: 0.01
            on_touch_up: if self.collide_point(*args[1].pos): root.test_b()
            on_touch_down: if self.collide_point(*args[1].pos): root.test_c()
     """)
    
    class SliderScreen(BoxLayout):
        def test_a(self):
            print("test_a accessed")
    
        def test_b(self):
            print("test_b accessed")
    
        def test_c(self):
            print("test_c accessed")  
    

    【讨论】:

    • 谢谢,非常感谢。我想我仍然需要学习正确搜索文档...
    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多