使用JsonStore在kivy android中保存变量

使用JsonStore在kivy android中保存变量,android,python,json,kivy,Android,Python,Json,Kivy,我想在kivy中为android应用程序保存一个变量(label.text),当应用程序重新启动时,它应该将变量加载回label.text 我尝试使用JsonStore保存变量 有没有更好的方法保存变量 但是当我运行代码时,我得到以下错误: ValueError:无法解码任何JSON对象 这是我的main.py文件: from kivy.app import App from kivy.storage.jsonstore import JsonStore from kivy.uix.boxlay

我想在kivy中为android应用程序保存一个变量(label.text),当应用程序重新启动时,它应该将变量加载回label.text

我尝试使用JsonStore保存变量

有没有更好的方法保存变量

但是当我运行代码时,我得到以下错误:

ValueError:无法解码任何JSON对象

这是我的main.py文件:

from kivy.app import App
from kivy.storage.jsonstore import JsonStore
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window


class Test(BoxLayout):
    Window.clearcolor = (1, 1, 1, 1)
    def save(self):
        store = JsonStore('hello.json')
        store.put('tito', score=label.text)

class MyApp(App):
    def build(self):
        return Test()
    def on_start(self):
        store = JsonStore('hello.json')
        label.text = store.get('tito')['score']


if __name__ == '__main__':
    MyApp().run()
<Test>:
    orientation: "vertical"
    BoxLayout:
        Label:
            id: label
            text: '0'
            color: 0,0,0,1
            pos: 250,200
            size: 50,50
            font_size:30
        Button:
            text: 'save'
            on_release: root.save()
        Button:
            text: 'load'
            on_release:

    Button:
        size_hint: 1, .5
        text: 'click me'
        on_press: label.text = str(int(label.text)+1)
这是我的我的.kv文件:

from kivy.app import App
from kivy.storage.jsonstore import JsonStore
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window


class Test(BoxLayout):
    Window.clearcolor = (1, 1, 1, 1)
    def save(self):
        store = JsonStore('hello.json')
        store.put('tito', score=label.text)

class MyApp(App):
    def build(self):
        return Test()
    def on_start(self):
        store = JsonStore('hello.json')
        label.text = store.get('tito')['score']


if __name__ == '__main__':
    MyApp().run()
<Test>:
    orientation: "vertical"
    BoxLayout:
        Label:
            id: label
            text: '0'
            color: 0,0,0,1
            pos: 250,200
            size: 50,50
            font_size:30
        Button:
            text: 'save'
            on_release: root.save()
        Button:
            text: 'load'
            on_release:

    Button:
        size_hint: 1, .5
        text: 'click me'
        on_press: label.text = str(int(label.text)+1)
:
方向:“垂直”
盒子布局:
标签:
id:标签
文本:“0”
颜色:0,0,0,1
邮政编码:250200
尺码:50,50
字体大小:30
按钮:
文本:“保存”
发布时:root.save()
按钮:
文本:“加载”
发布时:
按钮:
尺寸提示:1.5
文本:“单击我”
按:label.text=str(int(label.text)+1)
以下是完整的错误消息:

 Traceback (most recent call last):
   File "main.py", line 25, in <module>
     MyApp().run()
   File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 823, in run
     self.dispatch('on_start')
   File "kivy/_event.pyx", line 699, in kivy._event.EventDispatcher.dispatch (kivy/_event.c:7394)
   File "main.py", line 20, in on_start
     store = JsonStore('hello.json')
   File "/usr/lib/python2.7/dist-packages/kivy/storage/jsonstore.py", line 25, in __init__
     super(JsonStore, self).__init__(**kwargs)
   File "/usr/lib/python2.7/dist-packages/kivy/storage/__init__.py", line 133, in __init__
     self.store_load()
   File "/usr/lib/python2.7/dist-packages/kivy/storage/jsonstore.py", line 34, in store_load
     self._data = loads(data)
   File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
     return _default_decoder.decode(s)
   File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
   File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
     raise ValueError("No JSON object could be decoded")
 ValueError: No JSON object could be decoded
回溯(最近一次呼叫最后一次):
文件“main.py”,第25行,在
MyApp().run()
文件“/usr/lib/python2.7/dist-packages/kivy/app.py”,第823行,运行中
自我分派(“启动时”)
kivy.\u event.EventDispatcher.dispatch(kivy/\u event.c:7394)中第699行的文件“kivy/\u event.pyx”
文件“main.py”,第20行,在开始时
store=JsonStore('hello.json')
文件“/usr/lib/python2.7/dist packages/kivy/storage/jsonstore.py”,第25行,在__
超级(JsonStore,self)。\uuuuuuuuuuuuuuuuuuuuuu(**kwargs)
文件“/usr/lib/python2.7/dist packages/kivy/storage/_init__.py”,第133行,在_init中__
self.store_load()
文件“/usr/lib/python2.7/dist packages/kivy/storage/jsonstore.py”,第34行,店内加载
自身数据=负载(数据)
文件“/usr/lib/python2.7/json/_init__.py”,第339行,加载
返回\u默认\u解码器。解码
文件“/usr/lib/python2.7/json/decoder.py”,第364行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
原始解码中的文件“/usr/lib/python2.7/json/decoder.py”,第382行
raise VALUERROR(“无法解码JSON对象”)
ValueError:无法解码任何JSON对象

提前感谢

此错误有点通用,但您的JSON似乎无效。您的JSON应该类似于:

{"tito": {"score": "3"}}
您可以在
Test
类中使用
\uuuuu init\uuuu
方法在开始时加载Json,我认为在这种情况下,它比在开始时使用
方法更简单

另一方面,在尝试获取JSON文件和密钥之前,需要测试它是否存在。否则,您可能是一个
KeyError
异常。除此之外,您可以使用try

from kivy.app import App
from kivy.storage.jsonstore import JsonStore
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.properties import ObjectProperty

kv_text = '''\
<Test>:
    orientation: "vertical"
    label: label
    BoxLayout:
        Label:
            id: label
            text: '0'
            color: 0,0,0,1
            pos: 250,200
            size: 50,50
            font_size:30
        Button:
            text: 'save'
            on_release: root.save()
        Button:
            text: 'load'
            on_release: root.load()

    Button:
        size_hint: 1, .5
        text: 'click me'
        on_press: label.text = str(int(label.text)+1)
'''

class Test(BoxLayout):
    label = ObjectProperty()
    Window.clearcolor = (1, 1, 1, 1)

    def __init__(self, **kwargs):
        super(Test,  self).__init__(**kwargs)
        self.store = JsonStore('hello.json')
        self.load()

    def save(self):
        self.store.put('tito', score= self.label.text)

    def load(self):
        try:
            self.label.text = self.store.get('tito')['score']
        except KeyError:
            pass


class MyApp(App):
    def build(self):
        Builder.load_string(kv_text)
        return Test()


if __name__ == '__main__':
    MyApp().run()
从kivy.app导入应用
从kivy.storage.jsonstore导入jsonstore
从kivy.uix.boxlayout导入boxlayout
从kivy.core.window导入窗口
从kivy.lang导入生成器
从kivy.properties导入ObjectProperty
kv_文本=“”\
:
方向:“垂直”
标签:标签
盒子布局:
标签:
id:标签
文本:“0”
颜色:0,0,0,1
邮政编码:250200
尺码:50,50
字体大小:30
按钮:
文本:“保存”
发布时:root.save()
按钮:
文本:“加载”
发布时:root.load()
按钮:
尺寸提示:1.5
文本:“单击我”
按:label.text=str(int(label.text)+1)
'''
类别测试(BoxLayout):
label=ObjectProperty()
Window.clearcolor=(1,1,1,1)
定义初始(自我,**kwargs):
超级(测试,自我)。\uuuuu初始化(**kwargs)
self.store=JsonStore('hello.json')
self.load()
def保存(自我):
self.store.put('tito',score=self.label.text)
def加载(自):
尝试:
self.label.text=self.store.get('tito')['score']
除KeyError外:
通过
类别MyApp(应用程序):
def生成(自):
生成器.加载字符串(kv\U文本)
返回测试()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
MyApp().run()