使用 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):
...
我想知道是否有人可以帮助我向小部件添加一些触摸 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):
...