How to Read a CSV File into a Kivy Spinner with Unique Values and Handle Repetitions

Reading CSV File into Spinner with Unique Values

In this article, we will explore how to read a CSV file and use its unique values as input for a spinner. We will also discuss the importance of handling repetitions in the same value.

Introduction

Kivy is an open-source Python library for creating multi-touch applications. In our previous articles, we have discussed various aspects of Kivy such as building user interfaces, handling events, and working with data sources like CSV files.

In this article, we will focus on reading a CSV file and using its unique values as input for a spinner. We will also explore how to handle repetitions in the same value.

Understanding CSV Files

A CSV (Comma Separated Values) file is a plain text file that stores tabular data, such as lists of numbers or strings. Each line of the file represents a single row of data, and each column represents a field or attribute of the data.

In our case, we have a CSV file called data.csv with two columns: distance and marks. The values in these columns are used to generate unique options for our spinner.

Reading CSV File into Kivy Spinner

To read the CSV file and use its unique values as input for our spinner, we can follow these steps:

  1. Import the necessary libraries, including pandas for data manipulation and kivy for building our application.
  2. Load the CSV file using pd.read_csv('data.csv').
  3. Extract the first column of the CSV file using df['distance'].
  4. Remove duplicates from the unique values in the distance column using Counter and sorting them using sorted().
  5. Create a list of strings representing the unique options for our spinner.
  6. Set these options as the values for our spinner.

Here’s an example code snippet:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.spinner import Spinner
import pandas as pd
from collections import Counter

Builder.load_string('''
<MainScreen>:
    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'top'
        BoxLayout:
            size_hint: 1, .9
            orientation: 'vertical'
            padding: 20
            spacing: 20
            Spinner:
                id: firsto
                text: 'select'
                values: root.optionf
                on_text: root.updatesecond(firsto.text)
            Spinner:
                id: secondo
                text: 'select'
                values: root.options


''')

class MainScreen(FloatLayout):
    def __init__(self, **kwargs):
        self.buildLists()
        super(MainScreen, self).__init__(**kwargs)

    def buildLists(self):
        df = pd.read_csv('data.csv')
        saved_column = df['distance'] #you can also use df['column_name']
        a = (Counter(saved_column))
        b = (sorted(a))
        print(b)
        self.optionf = [str(row) for row in b]
        self.options = ['Select']

    def updatesecond(self,text):
        if text == 'a':
            self.ids.secondo.values =['1','2']
        elif text == 'b':
            self.ids.secondo.values =['3','4']
        else:
            self.ids.secondo.values =['5','6']

    def onExit(self):
        App.get_running_app().stop()

class TestApp(App):
    def build(self):
        return MainScreen()
if __name__ == "__main__": 
    TestApp().run() 

Handling Repetitions

In our example code, we use Counter and sorted() to remove duplicates from the unique values in the distance column. This ensures that each value is only used once as an option for our spinner.

However, if there are repetitions of the same value, they will be removed by the Counter. For instance, if the distance value ‘70.1’ appears three times in the CSV file, it will only be included once in our list of options.

To handle these repetitions, we can modify our code to include all values from the CSV file, regardless of their frequency. Here’s an updated code snippet:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.spinner import Spinner
import pandas as pd

Builder.load_string('''
<MainScreen>:
    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'top'
        BoxLayout:
            size_hint: 1, .9
            orientation: 'vertical'
            padding: 20
            spacing: 20
            Spinner:
                id: firsto
                text: 'select'
                values: root.optionf
                on_text: root.updatesecond(firsto.text)
            Spinner:
                id: secondo
                text: 'select'
                values: root.options


''')

class MainScreen(FloatLayout):
    def __init__(self, **kwargs):
        self.buildLists()
        super(MainScreen, self).__init__(**kwargs)

    def buildLists(self):
        df = pd.read_csv('data.csv')
        saved_column = df['distance']
        a = [str(row) for row in saved_column]
        print(a)
        self.optionf = a
        self.options = ['Select']

    def updatesecond(self,text):
        if text == 'a':
            self.ids.secondo.values =['1','2']
        elif text == 'b':
            self.ids.secondo.values =['3','4']
        else:
            self.ids.secondo.values =['5','6']

    def onExit(self):
        App.get_running_app().stop()

class TestApp(App):
    def build(self):
        return MainScreen()
if __name__ == "__main__": 
    TestApp().run() 

Conclusion

In this article, we explored how to read a CSV file and use its unique values as input for a spinner. We discussed the importance of handling repetitions in the same value and provided an example code snippet that demonstrates how to achieve this.

By following these steps and using Kivy’s built-in libraries and functionality, you can create applications that interact with data sources like CSV files and provide users with meaningful options based on that data.


Last modified on 2024-04-24