[英]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
的小部件(如OneLineListItem
和MDRectangleFlatIconButton
)在on_press
和on_release
行为中内置了该测试,因此您可以对这些小部件使用on_press
或on_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]
是touch
, pos
是那个touch
的 position 。 前面的*
将pos
扩展到它的x
、 y
分量(正如collide_point()
方法所期望的那样)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.