繁体   English   中英

为什么 KivyMD on_touch_down 事件会触发多个项目?

[英]Why is KivyMD on_touch_down event triggering multiple items?

我的 KivyMD 应用程序中有一个屏幕,其中包含项目列表。 我的目标是根据单击的项目导航到不同的屏幕。 我注意到无论我选择哪个项目,下一个屏幕都会或不会与单击的项目相关。 似乎是随机的。

下面是一个可重现的例子。 为了简化,我删除了大部分项目,并用简单的打印 function 替换了导航。

单击项目或“取消”按钮时,会打印多个文本,就好像我单击了屏幕的多个元素一样(例如,单击 item1 会导致打印“item3 item2 item1”)我怀疑这就是为什么导航不一致

我觉得这很混乱。 有人可以解释一下这里发生了什么吗? 谢谢:)

from kivy.lang import Builder
from kivymd.app import MDApp

KV = '''
MDScreen:
    name: "screen1"         
    MDBoxLayout:
        orientation: "vertical"
        MDToolbar:
            id : tb_screen1
            title: "Select Item"
            on_touch_down:   
                app.p(self.title)
        ScrollView:
            MDList:
                OneLineListItem:
                    text: "item1"
                    on_touch_down:   
                        app.p(self.text)
                        
                OneLineListItem:
                    text: "item2"
                    on_touch_down:
                        app.p(self.text)
                          
                OneLineListItem:
                    text: "item3"
                    on_touch_down:
                        app.p(self.text)
                           
                        
        MDBoxLayout:
            MDFloatLayout:                           
                MDRectangleFlatIconButton:
                    text: "Cancel"
                    on_press:
                        app.p(self.text)

'''

class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def p(self,text):
        print(text)

MainApp().run()

这是touch事件处理的设计行为。 touch事件被传递给所有小部件,每个小部件负责确定它是否应该响应touch 扩展ButtonBehavior的小部件(如OneLineListItemMDRectangleFlatIconButton )在on_presson_release行为中内置了该测试,因此您可以对这些小部件使用on_presson_release (而不是on_touch_down )。

MDToolbar没有ButtonBehavior ,因此您必须将该测试添加到您的on_touch_down中。 你可以这样做:

    MDToolbar:
        id : tb_screen1
        title: "Select Item"
        on_touch_down:
            app.p(self.title) if self.collide_point(*args[1].pos) else False

仅当触摸点在MDToolbar的范围内时,上述kv代码才会调用app.p(self.title) 上面的args是 kivy 中的关键字(参见关键字)。 args[1]touchpos是那个touch的 position 。 前面的*pos扩展到它的xy分量(正如collide_point()方法所期望的那样)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM