在 KivyMD Python 的 JSON 文件中存储数据时出错
Error while Storing data in a JSON file in KivyMD Python
我试图将从用户那里获取的用户名存储在 .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()
这是您的代码的修改版本,可以满足您的要求:
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()
方法中的更改以及正在构建 ScreenManager
和 SetUpWindow
的其他代码的删除。对 self.screen
的引用已替换为 self.root
。 Next
按钮现在保存用户名。
我试图将从用户那里获取的用户名存储在 .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()
这是您的代码的修改版本,可以满足您的要求:
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()
方法中的更改以及正在构建 ScreenManager
和 SetUpWindow
的其他代码的删除。对 self.screen
的引用已替换为 self.root
。 Next
按钮现在保存用户名。