如何从python / kivy应用程序存储数据

时间:2018-06-25 17:48:23

标签: mysql python-3.x sqlite kivy

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

例如我在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()

1 个答案:

答案 0 :(得分:1)

当然,您可以使用sqlite3,但是像您的实例一样为kivy应用存储基本数据的最简单方法是将json文件与kivy自己的JsonStore类一起使用。 这样做的好处是,可以根据部署文件的平台将文件分配到正确的位置,而无需关心确切的位置。

这是使用get(),put()和exist()方法存储TextInput中键入的文本并将其加载到Label上的简单示例。 (您不需要创建文件本身,只需初始化对象并在其中写入(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的字典一样。

对于kivy的JsonStore类,假定您正在使用至少两个级别,因此 {“ mydata”:{“ text”:“您上次编写的内容”}} 。在这个简单的示例中,嵌套一个dict并没有多大意义,但总的来说,这正是您真正的应用所需要的,例如,如果您要获取多个联系人的联系人数据,或者想要存储各种配置为应用本身提供多个小部件(在这种情况下,您可能需要在加载小部件之前读取(获取())数据,可能是在App类的build()方法中)。

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