Kivy Listview excel file

Tengo una pregunta con respecto a Kivy listview y Pandas dataframes. Específicamente, cómo listar datos desde .xlsx a listview de kivy y luego digamos eliminar la entrada seleccionada. Este es mi código principal:

import pandas from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import ObjectProperty from kivy.uix.listview import ListItemButton class ItemsListItemButton(ListItemButton): pass class QuestionDb(BoxLayout): items_list = ObjectProperty() def dataframe(self): df = pandas.read_excel("items.xlsx") return df class QuestionApp(App): def build(self): return QuestionDb() Questionapp= QuestionApp() Questionapp.run() 

Este es el archivo question.kv utilizado para obtener la vista de lista y el botón

 #: import main question #: import ListAdapter kivy.adapters.listadapter.ListAdapter #: import LitsItemButton kivy.uix.listview.ListItemButton QuestionDb: : items_list: items_list_view ListView: id:items_list_view adapter: ListAdapter(data=main.QuestionDb.dataframe(self) , cls=main.ItemsListItemButton) Button: text: "Deletes selected entry on press" 

Y esta es la hoja de cálculo de Excel “items.xlsx” que establecimos como nuestro dataframe:

  Item: Cost: Remaining: Boots 10$ 5 Socks 2$ 4 Hats 5$ 10 

Ahora, con esta configuración, la vista en kivy solo muestra los nombres de las columnas y no muestra otros elementos, ¿cómo puedo hacer que los elementos aparezcan en la lista de ejemplos?

 Boots 10$ 5 Socks 2$ 4 Hats 5$ 10 

En lugar de esto

    También se agradecerán todos los consejos sobre cómo vincular el botón para luego eliminar la entrada seleccionada.

    Espero que esto tenga sentido.

    Debe usar Recycleview porque Listview ha quedado en desuso desde la versión 1.10.0 .

    En el siguiente ejemplo, estamos usando una vista de reciclaje con botones de diseño de cuadrícula de reciclaje seleccionable . Recycleview admite desplazarse hacia arriba y hacia abajo. Hemos enlazado el botón con el evento on_release . También puede cambiar el botón para enlazar el evento on_press . Haga clic en cualquier fila para invocar el método, delete_row .

    Documentación de Kivy RecycleView

    Ejemplo

    pregunta.py

     import pandas from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.recycleview.views import RecycleDataViewBehavior from kivy.uix.button import Button from kivy.properties import BooleanProperty, ListProperty, ObjectProperty from kivy.uix.recyclegridlayout import RecycleGridLayout from kivy.uix.behaviors import FocusBehavior from kivy.uix.recycleview.layout import LayoutSelectionBehavior from kivy.core.window import Window class SelectableRecycleGridLayout(FocusBehavior, LayoutSelectionBehavior, RecycleGridLayout): ''' Adds selection and focus behaviour to the view. ''' class SelectableButton(RecycleDataViewBehavior, Button): ''' Add selection support to the Label ''' index = None selected = BooleanProperty(False) selectable = BooleanProperty(True) def refresh_view_attrs(self, rv, index, data): ''' Catch and handle the view changes ''' self.index = index return super(SelectableButton, self).refresh_view_attrs( rv, index, data) def on_touch_down(self, touch): ''' Add selection on touch down ''' if super(SelectableButton, self).on_touch_down(touch): return True if self.collide_point(*touch.pos) and self.selectable: return self.parent.select_with_touch(self.index, touch) def apply_selection(self, rv, index, is_selected): ''' Respond to the selection of items in the view. ''' self.selected = is_selected class QuestionDb(BoxLayout): items_list = ObjectProperty(None) column_headings = ObjectProperty(None) rv_data = ListProperty([]) def __init__(self, **kwargs): super(QuestionDb, self).__init__(**kwargs) self.get_dataframe() def get_dataframe(self): df = pandas.read_excel("items.xlsx") # Extract and create column headings for heading in df.columns: self.column_headings.add_widget(Label(text=heading)) # Extract and create rows data = [] for row in df.itertuples(): for i in range(1, len(row)): data.append([row[i], row[0]]) self.rv_data = [{'text': str(x[0]), 'Index': str(x[1]), 'selectable': True} for x in data] def delete_row(self, instance): # TODO print("delete_row:") print("Button: text={0}, index={1}".format(instance.text, instance.index)) print(self.rv_data[instance.index]) print("Pandas: Index={}".format(self.rv_data[instance.index]['Index'])) class QuestionApp(App): def build(self): Window.clearcolor = (1, 1, 1, 1) # white background return QuestionDb() if __name__ == "__main__": QuestionApp().run() 

    pregunta.kv

     #:kivy 1.10.0 : # Draw a background to indicate selection canvas.before: Color: rgba: (0, 0.517, 0.705, 1) if self.selected else (0, 0.517, 0.705, 1) Rectangle: pos: self.pos size: self.size background_color: [1, 0, 0, 1] if self.selected else [1, 1, 1, 1] # dark red else dark grey on_release: app.root.delete_row(self) : column_headings: column_headings orientation: "vertical" Label: canvas.before: Color: rgba: (0, 0, 1, .5) # 50% translucent blue Rectangle: pos: self.pos size: self.size text: 'Click on any row to delete' size_hint: 1, 0.1 GridLayout: canvas.before: Color: rgba: (1, 0.2, 0, .5) # 50% translucent orange red Rectangle: pos: self.pos size: self.size id: column_headings size_hint: 1, None size_hint_y: None height: 25 cols: 3 BoxLayout: canvas.before: Color: rgba: (.0, 0.9, .1, .3) Rectangle: pos: self.pos size: self.size RecycleView: viewclass: 'SelectableButton' data: root.rv_data SelectableRecycleGridLayout: cols: 3 key_selection: 'selectable' default_size: None, dp(26) default_size_hint: 1, None size_hint_y: None height: self.minimum_height multiselect: True touch_multiselect: True 

    Salida

    Img01 - Fila pulsada 2