当我们释放对 kivy 开关项目的点击时,如何触发一个事件?
How to fire one event when we release the click on a kivy switch item?
目标:当我点击然后释放开关小部件上的点击时,它会在释放时触发我一个事件。
问题:我使用了 on_touch_down() 开关方法但是:
- 它在点击释放时释放 2 个事件,而不是一个。
- 当我释放并显示“关闭”时,它显示“真”,当它打开“打开”时显示“假”!
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
KV = '''
MyGridLayout:
Switch:
id: switch_ecs
on_touch_up:
root.on_switch("ecs")
'''
class MyGridLayout(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def on_switch(self,element_id):
print(self.ids["switch_" + element_id].active)
class MyApp(MDApp):
def build(self):
self.screen = Builder.load_string(KV)
return self.screen
if __name__ == '__main__':
MyApp().run()
Kivy 有一些模糊的逻辑,导致 touch up 事件被分派两次到某些小部件(如 Buttons
和 Switches
)。您的代码的修复方法是为您的 on_switch()
方法使用不同的触发器。您可以使用:
on_touch_down:
root.on_switch("ecs")
或:
on_active:
root.on_switch("ecs")
目标:当我点击然后释放开关小部件上的点击时,它会在释放时触发我一个事件。
问题:我使用了 on_touch_down() 开关方法但是:
- 它在点击释放时释放 2 个事件,而不是一个。
- 当我释放并显示“关闭”时,它显示“真”,当它打开“打开”时显示“假”!
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
KV = '''
MyGridLayout:
Switch:
id: switch_ecs
on_touch_up:
root.on_switch("ecs")
'''
class MyGridLayout(GridLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def on_switch(self,element_id):
print(self.ids["switch_" + element_id].active)
class MyApp(MDApp):
def build(self):
self.screen = Builder.load_string(KV)
return self.screen
if __name__ == '__main__':
MyApp().run()
Kivy 有一些模糊的逻辑,导致 touch up 事件被分派两次到某些小部件(如 Buttons
和 Switches
)。您的代码的修复方法是为您的 on_switch()
方法使用不同的触发器。您可以使用:
on_touch_down:
root.on_switch("ecs")
或:
on_active:
root.on_switch("ecs")