我有一个测试python代码段:
py文件:
from kivy.app import App
class tutorApp(App):
def bn_pressed(self,button):
print(button.text)
return True
app = tutorApp()
app.load_kv('tutorial-3.kv')
app.run()
和kv文件(tutorial-3.kv):
<Tb@Button>:
on_touch_down:app.bn_pressed(self)
BoxLayout:
Tb:
text:'button1'
Tb:
text:'button2'
Tb:
text:'button3'
当我从左到右按下这三个按钮时,我得到了:
# press left
button3
button2
button1
# press middle
button3
button2
# press right
button3
然后我更改行:
<Tb@Button>
到
<Tb@Lable>
再按一次,我得到:
# press left label
button3
button2
button1
# press middle label
button3
button2
button1
# press right label
button3
button2
button1
造成这种差异的原因是什么?假设当我在event_handler中将True重新设置为True时,就停止了事件的传播,为什么它被keep get调用?
感谢您的帮助。
顺便说一句。如果将事件更改为on_press,则在按下三个按钮中的任何一个时,一切都很好,将调用正确的处理程序和正确的句柄。
答案 0 :(得分:1)
标签文档指出,如果返回True,则传播将停止。我建议一个错误报告。我看到您在此示例中所做的相同操作。
https://kivy.org/doc/stable/api-kivy.uix.label.html
on_touch_down(触摸)
bool如果为True,则将停止调度touch事件。如果为False,则事件将继续分配到窗口小部件树的其余部分。
答案 1 :(得分:0)
on_touch_down
方法必须返回True才能停止传播。您在kv中使用的on_touch_down:
不会替代此方法或任何其他python代码,而只是附加到on_touch_down
事件。这意味着您可以例如在相同的kv规则中多次写入on_touch_down:
,并使所有绑定仍然有效。