自定义小部件在Kivy中未接收触摸事件

4 投票
1 回答
694 浏览
提问于 2025-04-18 11:28

我在理解kivy的时候遇到了一些困难。我正在创建一个图形界面,里面有两个按钮和一个自定义的小部件,这个小部件应该能够打印出它接收到的触摸坐标。问题是,这个自定义的小部件似乎没有接收到来自btn2的触摸事件。我认为它应该能接收到这个事件,因为根部件(也就是窗口)应该把事件传递给它所有的子部件(包括这个自定义的小部件)。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ListProperty

class RootWidget(BoxLayout):

    def __init__(self, **kwargs):
        super(RootWidget, self).__init__(**kwargs)
        self.add_widget(Button(text="btn1"))

        self.add_widget(CustomBtn())

        self.add_widget(Button(text="btn2"))

class CustomBtn(Widget):

    pressed = ListProperty([0,0])

    def on_touch_down(self, touch):
        self.pressed = touch.pos
        return False

    def on_pressed(self, instance, value):
        print "[CustomBtn] touch down at ", value

class Demo(App):

    def build(self):
        return RootWidget()


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

1 个回答

2

我找到了答案,问题在于事件是按照相反的顺序发送给小部件的,也就是说在我的例子中,顺序是 btn2CustomBtn,然后是 btn1。所以当你点击 btn2 的时候,它会先处理这个触摸事件,这样 CustomBtn 就收不到这个事件了。调整小部件的顺序就能解决这个问题。

撰写回答