在 kivy 中检查子交互的语法
Posted
技术标签:
【中文标题】在 kivy 中检查子交互的语法【英文标题】:Syntax for checking child interactions in kivy 【发布时间】:2021-06-16 20:41:40 【问题描述】:我正在从一本涉及制作绘画应用程序的书中学习 kivy。作者有一次在画布类(继承自 Widget)上介绍了新按钮,并说我们必须检查应用程序在画布上收到的点击是否也位于其子之一上。在这种情况下,我们会忽略前者而对后者采取行动。 我想通过遍历 self.children 来实现这一点,检查 on_touch_down(touch) 成员函数是否为任何孩子返回 true,如果是则从函数返回:
class CanvasWidget(Widget):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.my_color = get_color_from_hex('#FF0000')
self.line_width=2
def on_touch_down(self, touch):
for child in self.children:
if(child.on_touch_down(touch)):
return
with self.canvas:
Color(rgba=self.my_color)
touch.ud['current_line'] = Line(points=(touch.x, touch.y), width=self.line_width)
这很好用。
但是,我不遵循并且想了解他的速记语法:
class CanvasWidget(Widget):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.my_color = get_color_from_hex('#FF0000')
self.line_width=2
def on_touch_down(self, touch):
#I don't understand the following line
if Widget.on_touch_down(self, touch):
return
#Widget refers to the parent class (I hope?) how does it check with the
#children?
with self.canvas:
Color(rgba=self.my_color)
touch.ud['current_line'] = Line(points=(touch.x, touch.y), width=self.line_width)
任何清晰度表示赞赏。谢谢!
【问题讨论】:
它不检查任何子小部件,它只是检查自己。该行显式调用on_touch_down()
方法的基类版本。
【参考方案1】:
Widget
类是所有 kivy 小部件的基类,它通过其on_touch_down()
方法将touch
事件传播到其子级。与其直接引用Widget
基类,更好的方法是使用super()
方法,如下所示:
if super(CanvasWidget, self).on_touch_down(touch):
return True
如果任何孩子想要停止传播,这将执行传播并返回True
(以停止传播)。 Widget
中的代码是:
for child in self.children[:]:
if child.dispatch('on_touch_down', touch):
return True
由于它不直接引用Widget
基类,如果您决定更改CanvasWidget
的基类,super()
方法会更安全。
【讨论】:
但是即使单击 CanvasWidget 本身,widget.on_touch_down(self, touch) 也不应该返回 true 吗? 不,on_touch_down()
方法只是将触摸传播给它的孩子(只要小部件未被禁用)。 kivy 的理念是每个小部件都应该收到每次触摸的通知,并有机会检查该触摸是否在其范围内。请注意,返回True
意味着停止触摸传播。以上是关于在 kivy 中检查子交互的语法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OSX 上的 Pycharm 中获得 Kivy、.kv、文件的语法高亮显示? [复制]
kivy-ios .toolchain.py:第 4 行:语法错误:Mac High Sierra 中文件意外结束
PyInstaller 3.2.1 与 Kivy 1.10.0 pyz 语法错误并且不打包