python - 为什么即使我们创建了多个小部件,自定义小部件的绑定也会占据所有焦点?
问题描述
我想创建 2 个标签,我可以在其中触发一个事件,并使用我双击的标签 shen 的名称执行操作。
问题:当我双击任意位置时,我创建/提供绑定的最后一个自定义小部件是触发器。所以它在小部件范围之外工作,所以它不是所需的功能。
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
class ClickableLabel(Label):
def __init__(self, **kwargs):
Label.__init__(self, **kwargs)
self.register_event_type('on_double_press')
if kwargs.get("on_double_press") is not None:
self.bind(on_double_press=kwargs.get("on_double_press"))
def on_touch_down(self, touch):
if touch.is_double_tap:
self.dispatch('on_double_press', touch)
print(self.text)
return True
return Label.on_touch_down(self, touch)
def on_double_press(self, *args):
pass
class MyApp(App):
def build(self):
boxlayout = BoxLayout()
label = ClickableLabel(text='Hello world', on_double_press=self.callback)
boxlayout.add_widget(label)
label_2 = ClickableLabel(text="it's Boby", on_double_press=self.callback)
boxlayout.add_widget(label_2)
return boxlayout
def callback(self, *args):
print("double clicked", args[0])
if __name__ == '__main__':
MyApp().run()
编辑:这是一个可聚焦布局的工作示例。
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.boxlayout import BoxLayout
class ClickableBoxLayout(ButtonBehavior, BoxLayout):
pass
class Line(ClickableBoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.idx = 0
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
self.idx += 1
print(self.idx)
class MyApp(App):
def build(self):
b = BoxLayout()
c_1 = Line()
b.add_widget(c_1)
c_2 = Line()
b.add_widget(c_2)
c_1.add_widget(Label(text="Hello"))
c_2.add_widget(Label(text="World"))
return b
MyApp().run()
解决方案
您需要使用collide_point()
来确定touch
事件是否发生在您的ClickableLabel
.
请参阅文档。
推荐阅读
- google-app-engine - GCP 应用程序引擎 flex 502 错误
- dockerfile - 如何创建两个扩展不同图像的其他相同容器
- simulink - 如何在 Simulink 中设置仿真的开始时间和结束时间?
- c++ - 如何将 unsigned int 转换为 unsigned char
- .net - Flurl 与 .net core 2.1 的兼容性
- typescript - 找不到命名空间“SchemaTypes”
- redux - Redux Saga - 从调用函数调度动作
- node.js - 如何在客户端正确显示从服务器请求的数据
- amazon-s3 - Athena Presto parse_duration 未注册
- python - 如何以合理的性能向熊猫数据框添加行