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()