Kusal Darshana
Kusal Darshana

Reputation: 167

Error while Storing data in a JSON file in KivyMD Python

I tried to store username taken from user in a .json file. But it dosen't work properly. After the user repeatedly enters the username, it is randomly stored in a json file. Please solve the problem with this code.

.kv file

screen_helper = """
ScreenManager:
    SetUpWindow:
    Home:

<SetUpWindow>:
    name: 'settingup'
    MDTextField:
        id:username_text_fied
        pos_hint: {'center_x':0.5,'center_y':0.45}
        size_hint: (0.7,0.1)
        hint_text : 'Name your Studio'
        helper_text: 'Required'
        helper_text_mode: 'on_focus'
        icon_right: 'account'
        icon_right_color: app.theme_cls.primary_light
        required : True
    MDRaisedButton:
        id:disabled_button
        disabled: True
        text:"Next"
        md_bg_color:app.theme_cls.primary_color
        pos_hint: {'center_x':0.9,'center_y':0.08}
        font_style: 'Button'
        ripple_rad_default : 40
        ripple_duration_out : 1
        md_bg_color: app.theme_cls.primary_dark
        on_press:
            root.manager.current = 'home'
            root.manager.transition.direction = 'left'   

<Home>:
    name: 'home'
"""

.py file

from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.app import MDApp
from kivy.storage.jsonstore import JsonStore

class SetUpWindow(Screen):
    pass

sm = ScreenManager()
sm.add_widget(SetUpWindow(name='settingup'))

class Mode(MDApp):
    def build(self):
        screen = Screen()
        self.screen = Builder.load_string(screen_helper)
        screen.add_widget(self.screen)
        self.username_text = self.screen.get_screen('settingup').ids.username_text_fied.text

        return screen


        self.store.put('UserInfo', name=self.username_text)
        self.username_changer()

    def username_changer(self):
        self.screen.get_screen('home').ids.bottomappbar.title = f"Studio {self.store.get('UserInfo')['name']}"


    def on_start(self):
        self.store = JsonStore("std_profile.json")
        try:
            if self.store.get('UserInfo')['name'] != "":
                self.username_changer()
                self.screen.get_screen('home').manager.current = 'home'

        except KeyError:
            self.screen.get_screen('settingup').manager.current = 'settingup'
            
Mode().run()

Upvotes: 0

Views: 142

Answers (1)

John Anderson
John Anderson

Reputation: 38857

Here is a modified version of your code that does what I think you want:

from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen
from kivymd.app import MDApp
from kivy.storage.jsonstore import JsonStore

screen_helper = """
ScreenManager:
    SetUpWindow:
    Home:

<SetUpWindow>:
    name: 'settingup'
    MDTextField:
        id:username_text_fied
        pos_hint: {'center_x':0.5,'center_y':0.45}
        size_hint: (0.7,0.1)
        hint_text : 'Name your Studio'
        helper_text: 'Required'
        helper_text_mode: 'on_focus'
        icon_right: 'account'
        icon_right_color: app.theme_cls.primary_light
        required : True
        on_text:
            disabled_button.disabled = False  # enable next button
    MDRaisedButton:
        id:disabled_button
        disabled: True
        text:"Next"
        md_bg_color:app.theme_cls.primary_color
        pos_hint: {'center_x':0.9,'center_y':0.08}
        font_style: 'Button'
        ripple_rad_default : 40
        ripple_duration_out : 1
        md_bg_color: app.theme_cls.primary_dark
        on_press:
            app.save_user_name()  # save user name to Json
            root.manager.current = 'home'
            root.manager.transition.direction = 'left'   

<Home>:
    name: 'home'
    MDBottomAppBar:
        MDToolbar:
            id: bottomappbar
            title: "Title"
            icon: "git"
            type: "bottom"
            left_action_items: [["menu", lambda x: x]]
            mode: "free-end"
"""

class SetUpWindow(Screen):
    pass


class Home(Screen):
    pass


class Mode(MDApp):
    def build(self):
        return Builder.load_string(screen_helper)

    def save_user_name(self):  # added method to actually save user name to JSon
        self.username_text = self.root.get_screen('settingup').ids.username_text_fied.text
        self.store.put('UserInfo', name=self.username_text)
        self.username_changer()

    def username_changer(self):
        self.root.get_screen('home').ids.bottomappbar.title = f"Studio {self.store.get('UserInfo')['name']}"

    def on_start(self):
        self.store = JsonStore("std_profile.json")
        try:
            if self.store.get('UserInfo')['name'] != "":
                self.username_changer()
                self.root.get_screen('home').manager.current = 'home'

        except KeyError as e:
            self.root.get_screen('settingup').manager.current = 'settingup'


Mode().run()

Note the change in the build() method and the elimination of the other code that was building ScreenManager and SetUpWindow. References to self.screen have been replaced with self.root. The Next button now saves the user name.

Upvotes: 1

Related Questions