在 KivyMD Python 中将数据存储在 JSON 文件中时出错

Posted

技术标签:

【中文标题】在 KivyMD Python 中将数据存储在 JSON 文件中时出错【英文标题】:Error while Storing data in a JSON file in KivyMD Python 【发布时间】:2021-10-17 20:34:18 【问题描述】:

我试图将取自用户的用户名存储在.json 文件中。但它不能正常工作。用户重复输入用户名后,随机存入一个json文件。请用这段代码解决问题。

有时.json 文件是随机创建的。但不是 第一时间。

.kv 文件

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 文件

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

【问题讨论】:

只有几厘米。不确定这是否对您的问题有任何影响。 return 之后的 build() 方法中的行将永远不会被执行。而您的build() 方法将您的App 构造为一个Screen,其中包含一个ScreenManager,其中包含另外两个Screens。这是你的意图吗?通常ScreenManagerroot。而且在您的 build() 方法中,您从用户没有机会与之交互的 Screen 分配 self.username_text 您还构建了大部分App 两次。 sm = ScreenManager()sm.add_widget(SetUpWindow(name='settingup')) 行正在构建同样包含在 Builder.load_string(screen_helper) 行中的部分。 @JohnAnderson - 谢谢先生的评论。其实我是初学者。您建议以什么方式成功且正确地编写此代码?可以举个例子吗? 【参考方案1】:

这是您的代码的修改版本,可以满足您的要求:

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

注意build() 方法的变化以及构建ScreenManagerSetUpWindow 的其他代码的消除。对self.screen 的引用已替换为self.rootNext 按钮现在保存用户名。

【讨论】:

以上是关于在 KivyMD Python 中将数据存储在 JSON 文件中时出错的主要内容,如果未能解决你的问题,请参考以下文章

Python kivy(kivymd)如何从MD存储和加载数据

在 python 脚本中导入 kivymd 模块时,会出现一个空白窗口

如何从for循环中获取用户输入的数据到kivymd中的python文件

第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList

在 KivyMD 上的小部件之间添加数值

如何从分配给 KivyMD Python 中的 MDLists 的 TextFields 获取数据