【问题标题】:How to store data from python/kivy app如何存储来自 python/kivy 应用程序的数据
【发布时间】:2018-12-04 08:48:43
【问题描述】:

我想知道如何存储应用中的数据,以便在重新运行应用时查看数据。

例如我在 TextInput 中输入了一些信息,然后当我单击提交按钮时,信息被粘贴在标签中,因此我关闭了应用程序,当我重新打开它时,信息应该出现在标签中。我知道有 sqlite3 和 mysql 但我不知道如何将它应用到我的 python/kivy 代码中。

请任何人建议我如何做到这一点。

如果可以举个例子,那就完美了。

提前致谢,

我的py代码:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from random import shuffle
from kivy.core.window import Window
Window.clearcolor = [1, 1, 1, 1]
Window.size = (550, 650)

Builder.load_file('builder.kv')


class MainScreen(ScreenManager):
    pass


class Menu(Screen):
    pass


class Levels(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def on_pre_enter(self):
        Window.bind(on_keyboard=self.voltar)

    def voltar(self, window, key, *args):
        if key == 27:
            App.get_running_app().root.current = 'menu'
            return True

    def on_pre_leave(self):
        Window.unbind(on_keyboard=self.voltar)


class LvLogos(Screen):
    def on_pre_enter(self):
        Window.bind(on_keyboard=self.voltar)

    def voltar(self, window, key, *args):
        if key == 27:
            App.get_running_app().root.current = 'menu'
            return True

    def on_pre_leave(self):
        Window.unbind(on_keyboard=self.voltar)


class Logo(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def shuffle(self):
        letter = self.letters
        self.s = shuffle(letter)
        return letter

    def on_pre_enter(self):
        Window.bind(on_keyboard=self.voltar)

    def voltar(self, window, key, *args):
        if key == 27:
            App.get_running_app().root.current = 'menu'
            return True

    def on_pre_leave(self):
        Window.unbind(on_keyboard=self.voltar)


class LvShields(Screen):
    pass


class Shield(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def shuffle(self):
        letter = self.letters
        self.s = shuffle(letter)
        return letter


class QuizZApp(App):
    def build(self):
        self.icon = 'C:\\Users\\gusta\\PycharmProjects\\QuizzApp\\Images\\QuizzLogo.png'
        return MainScreen()


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

【问题讨论】:

    标签: mysql python-3.x sqlite kivy


    【解决方案1】:

    当然,您可以使用 sqlite3,但是为 kivy 应用程序(例如您的示例)存储基本数据的最简单方法是使用带有 kivy 自己的 JsonStore 类的 json 文件。 它的好处是根据部署的平台将文件分配到正确的位置,您无需关心确切的位置。

    这是一个简单的例子,它使用 get()、put() 和 exists() 方法来存储来自 TextInput 的键入文本并将其加载到标签上。 (您不需要自己创建文件,只需初始化对象并在其中写入 (put()))。

    from kivy.uix.boxlayout import BoxLayout
    from kivy.storage.jsonstore import JsonStore
    from kivy.base import runTouchApp
    from kivy.lang import Builder
    from kivy.properties import ObjectProperty
    
    kv='''
    RootWidget:
        orientation: 'vertical'
        BoxLayout:
            TextInput:
                id: txtinpt
            Label:
                id: lbl
                text: root.stored_data.get('mydata')['text'] if root.stored_data.exists('mydata') else ''
        Button:
            size_hint_y: .3
            text: 'Submit'
            on_press:
                root.stored_data.put('mydata', text=txtinpt.text)
                lbl.text = txtinpt.text
    '''
    
    class RootWidget(BoxLayout):
        stored_data = ObjectProperty(None)
        def __init__(self, *args, **kwargs):
            super(BoxLayout, self).__init__(*args, **kwargs)
            self.stored_data = JsonStore('data.json')
    
    
    runTouchApp(Builder.load_string(kv))
    

    如果你是 Json 的新手,它是一个包含对列表的文件,它本身的值可能是一个新的对列表。很像python的dict。

    对于 kivy 的 JsonStore 类,它假设您至少使用两个级别,因此 {"mydata": {"text": "What you have written last run"}}。在这个简单的示例中,嵌套 dict 没有多大意义,但一般来说,这正是您真正需要的应用程序,例如,如果您想要获取多个联系人的联系人数据,或者您想要存储各种配置对于应用程序本身的多个小部件(在这种情况下,您可能希望在加载小部件之前读取 (get()) 数据,可能在 App 类的 build() 方法中)。

    参考:https://kivy.org/docs/api-kivy.storage.html

    【讨论】:

    • 我刚刚在这里添加了我的 py 代码。实际上我的代码有太多的 kv 文件。我是否必须在我拥有的所有 kv 文件的每个按钮上添加 store_date 函数?
    • 如果您将所有逻辑都放在 py 文件或模块中,这是正确的做法,我根本看不到从 kv 访问 store_date 的理由。在我的示例中,我直接从 kv 代码中的 on_press 调用“JsonStore.put()”,只是为了简单地演示类方法本身。但在现实生活中,您可能会调用 Python 文件中定义的函数,该函数进而可以访问保存数据的 JsonStore 对象。
    猜你喜欢
    • 2010-09-06
    • 2014-08-27
    • 2021-04-08
    • 2012-06-04
    • 2023-03-11
    • 2021-11-11
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多