使用 Kivy 向小部件添加触摸 event/click 功能时出现问题

Problem adding touch event/click functionality to a widget with Kivy

我想知道是否有人可以帮助我向小部件添加一些触摸 event/click 功能。我尝试了一些方法,包括以下方法,结果什么也没发生:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color

class MyWidget(Widget):
    def __init__(self,**kwargs):
        super(MyWidget, self).__init__(**kwargs)
        
        with self.canvas:
            Color(22.0/255.0, 24.0/255.0, 72.0/255.0, 1)
            self.bg=Rectangle(pos=self.pos, size=self.size)

class MyApp(App):
    def build(self):
        root = Widget()
        btn = MyWidget(pos=(50,50), size=(50,50))
        btn.bind(on_release=self.widgetClick)
        root.add_widget(btn)
        return root
    
    def widgetClick(self, obj):
        print("Click")
        
MyApp().run()

除此之外,这会导致只要在 window 中点击,而不仅仅是在小部件上点击,就会触发事件:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color

class MyWidget(Widget):
    def __init__(self,**kwargs):
        super(MyWidget, self).__init__(**kwargs)
        
        with self.canvas:
            Color(22.0/255.0, 24.0/255.0, 72.0/255.0, 1)
            self.bg=Rectangle(pos=self.pos, size=self.size)

    def on_touch_down(self, touch):
        print("Touch")

class MyApp(App):
    def build(self):
        root = Widget()
        btn = MyWidget(pos=(50,50), size=(50,50))
        root.add_widget(btn)
        return root
        
MyApp().run()

所以我的问题是,解决这个问题的正确方法是什么,或者我做错了什么?如果不是很明显,我对 Kivy 还很陌生,因为我通常使用 PySimpleGUI 创建我的 Python GUI,但由于我遇到的限制,我决定尝试 Kivy。

非常感谢任何帮助!

on_touch_down 做你想做的,但你需要将它与碰撞检查结合起来:

def on_touch_down(self, touch):
    if not self.collide_point(*touch.pos):
        return False

如果您想像第一个示例中那样使用 on_release,您的小部件需要继承自 ButtonBehavior:

class YourWidget(ButtonBehavior, Widget):
    ...