Search code examples
pythonkivykivy-language

Kivy Product Search Program


from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
import json
import re

class Grid(GridLayout):

def __init__(self, **kwargs):
    super(Grid, self).__init__(**kwargs)

    # Columns for the main view
    self.cols = 1


    # Start of the Inside
    self.inside = GridLayout()
    self.inside.rows = 3


    self.inside.add_widget(Label(text = 'Enter the Brand Name for its Products: '))
    self.brand_input = TextInput(multiline = False)
    self.inside.add_widget(self.brand_input)


    # Add the things in inside to the main
    self.add_widget(self.inside)


    self.submit = Button(text = 'Submit', font_size = 20)
    self.submit.bind(on_press = self.pressed)
    self.add_widget(self.submit)


def pressed(self, instance):
    # Pull the text inside the textInput
    brand_name = self.brand_input.text

    with open('mcg_app/brands.json', 'r') as f:
        brands_dict = json.load(f)

    request = brands_dict[brand_name]
    modified_result = re.sub(r',\s(?![^(]*\))', "\n", str(request))

    self.inside.add_widget(Label(text = modified_result))

    # Clear out the fields after submitting
    self.brand_input.text = ''





class Mcg(App):

def build(self):
    return Grid()



if __name__ == '__main__':
    Mcg().run()

Hello, this program here has a text input box and the user inputs a brand name for example "Dove" after that he presses the submit button, and the button is connected to the pressed() function. Everything about the program is actually working fine the only problem is after I print the products of the entered brand let's say he inputs a different brand in that case the old output is still there so the program outputs new products with the old ones already there. How can I fix this? Thanks in advance


Solution

  • I can't really test it without a json data file, but check out this:

    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.textinput import TextInput
    from kivy.uix.button import Button
    import json
    import re
    
    
    class Grid(GridLayout):
    
        def __init__(self, **kwargs):
            super(Grid, self).__init__(**kwargs)
    
            # Columns for the main view
            self.cols = 1
    
            # Start of the Inside
            self.inside = GridLayout()
            self.inside.rows = 3
    
            self.inside.add_widget(Label(text='Enter the Brand Name for its Products: '))
            self.brand_input = TextInput(multiline=False)
            self.inside.add_widget(self.brand_input)
    
            # Add the things in inside to the main
            self.add_widget(self.inside)
    
            self.submit = Button(text='Submit', font_size=20)
            self.submit.bind(on_press=self.pressed)
            self.add_widget(self.submit)
    
        def pressed(self, instance):
            # Clear out the fields after submitting
            self.brand_input.text = ''
            self.inside.clear_widgets()
            self.inside.add_widget(Label(text='Enter the Brand Name for its Products: '))
            self.inside.add_widget(self.brand_input)
    
            # Pull the text inside the textInput
            brand_name = self.brand_input.text
    
            with open('mcg_app/brands.json', 'r') as f:
                brands_dict = json.load(f)
    
            request = brands_dict[brand_name]
            modified_result = re.sub(r',\s(?![^(]*\))', "\n", str(request))
    
            self.inside.add_widget(Label(text=modified_result))
    
    
    class Mcg(App):
    
        def build(self):
            return Grid()
    
    
    if __name__ == '__main__':
        Mcg().run()
    

    It resets the self.inside GridLayout on every button press...