Kivy问题:如何为继承自FloatLayout的浮动按钮添加on_release方法?
问题根源
你猜的没错,FloatLayout本身没有on_release事件,直接给FloatButton绑定该事件会触发AttributeError。你的FloatButton是用FloatLayout包裹了一个可点击的Button,真正能响应点击动作的是内部的这个Button,需要把点击事件从内部按钮传递到外部的FloatButton上。
方案一:修改FloatButton继承自Button(更简洁)
直接让FloatButton继承Button,天然支持on_release事件,同时保留椭圆样式:
<FloatButton@Button>: text: '' btn_size: (70, 70) size_hint: (None, None) size: self.btn_size background_normal: '' background_color: (0, 0, 0, 0) canvas.before: Color: rgba: (0.404, 0.227, 0.718, 1.0) Ellipse: size: self.size pos: self.pos
在MainWindow中直接绑定on_release即可正常工作:
<MainWindow>: name: 'main' # ... 其他布局代码 ... FloatButton: id: addButton text: '+' markup: True pos_hint: {"x":.5,"top":.5} on_release: print("[TEST] on_release works!")
方案二:保留FloatLayout,传递内部按钮的点击事件
如果必须保留FloatLayout作为基类,需要在内部Button的on_release中触发FloatButton的自定义事件:
修改FloatButton的kv定义
<FloatButton@FloatLayout>: id: float_add_button size_hint: (None, None) text: '' btn_size: (70, 70) size: (70, 70) bg_color: (0.404, 0.227, 0.718, 1.0) # 声明自定义on_release事件 on_release: pass Button: text: float_add_button.text markup: True font_size: 40 size_hint: (None, None) size: float_add_button.btn_size pos_hint: {'x': .5, 'y': .8} background_normal: '' background_color: (0, 0, 0, 0) canvas.before: Color: rgba: (0.404, 0.227, 0.718, 1.0) Ellipse: size: self.size pos: self.pos # 内部按钮点击时,触发外部FloatButton的on_release事件 on_release: float_add_button.dispatch('on_release')
修改后,你原本在MainWindow中绑定的on_release逻辑会被正常触发。
验证效果
两种方案都能解决AttributeError: release的问题,运行后点击按钮会输出[TEST] on_release works!。
内容的提问来源于stack exchange,提问作者gitcanzo
相关产品推荐
相关产品推荐

