关于奇异果事件调度行为的问题

时间:2019-01-01 12:41:52

标签: python kivy

我有一个测试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,则在按下三个按钮中的任何一个时,一切都很好,将调用正确的处理程序和正确的句柄。

2 个答案:

答案 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:,并使所有绑定仍然有效。