from math import inf

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import NumericProperty, StringProperty, ListProperty


class Field(BoxLayout):
    index = NumericProperty()
    entry = StringProperty()


class Fields(BoxLayout):
    entries = ListProperty([])  # elements are strings (some may not be valid numbers)

    def rebuild(self):
        while len(self.children) > len(self.entries):
            self.remove_widget(self.children[0])
        while len(self.children) < len(self.entries):
            self.add_widget(Field(index=len(self.children)))

    def on_entries(self, _, __):
        self.rebuild()
        for field, entry in zip(reversed(self.children), self.entries):
            field.entry = entry


class SmallestPositiveApp(App):
    entries = ListProperty([])  # elements are strings (some may not be valid numbers)
    result = NumericProperty(inf)

    def add_field(self):
        self.entries.append('')

    def remove_field(self):
        try:
            self.entries.pop()
        except IndexError:
            pass

    @staticmethod
    def _find_smallest_positive(entries):
        smallest_positive = inf
        for entry in entries:
            try:
                value = float(entry)
                if 0 < value < smallest_positive:
                    smallest_positive = value
            except ValueError:
                pass
        return smallest_positive

    def on_entries(self, _, __):
        self.result = SmallestPositiveApp._find_smallest_positive(self.entries)

    def set_entry(self, index, entry):
        self.entries[index] = entry


if __name__ == '__main__':
    app = SmallestPositiveApp()
    app.run()