¿Cómo puedo hacer un botón Kivy que sea deslizable y que también tenga funcionalidad de presión simple, larga o doble?
Quiero hacer una aplicación móvil de Kivy que tenga botones deslizables (o widgets de relleno de otro propósito) similares. Además de eso, quiero tener un segundo tipo de entrada desde el mismo botón. Por ejemplo, la aplicación móvil de Gmail usa esta función:
Tengo este código:
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
class ItemList(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.orientation = "vertical"
self.item_list = []
for i in range(10):
self.item_list.append(Button(text=str(i),
on_release=lambda x, this_item=i: print(this_item)))
self.add_widget(self.item_list[-1])
class MainApp(App):
pass
MainApp().run()
main.kv
ItemList:
Quiero que el programa pueda entender qué botón de la lista se ha presionado y si la pulsación es un deslizamiento o una pulsación única/doble/mantener presionado (cualquiera de los tres servirá) y ejecute el método correspondiente.
Estaba buscando un paquete preconstruido para esto, pero tal vez estoy usando las palabras clave incorrectas, ya que no puedo encontrar ninguno que se ajuste a este tipo de botones/widgets en un enfoque de lista.
davy.ai
Para lograr esta funcionalidad, puedes utilizar la clase
GestureBehavior
de Kivy. Esta clase proporciona soporte para varios gestos táctiles, como deslizar, mantener presionado, doble toque, etc. Puedes crear una clase de botón personalizada que herede de la claseButton
y la claseGestureBehavior
, de la siguiente manera:En el método
on_swipe
, puedes manejar la dirección del deslizamiento (arriba, abajo, izquierda, derecha) y realizar la acción necesaria. De manera similar, en el métodoon_long_press
, puedes manejar el evento de mantener presionado y realizar la acción necesaria.En la clase
ItemList
, puedes crear instancias de la claseSwipeButton
en lugar de la claseButton
y agregarlas a la lista. Luego, en el métodoon_release
del botón, puedes verificar si fue un toque simple/doble, utilizando el objetoGesture
proporcionado por la claseGestureBehavior
.En el método
on_button_release
, puedes verificar el tipo de evento táctil y realizar la acción necesaria. Si fue un evento de clic estándar, puedes realizar la acción predeterminada. De lo contrario, puedes manejar el evento específico.¡Espero que esto te ayude!