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

ohtdti5x  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(484)

我想知道如何从我的应用程序中存储数据,以便在重新运行应用程序时查看数据。
e、 我在textinput中键入一些信息,然后单击submit按钮,这些信息就会粘贴到标签中,因此我关闭了应用程序,当我重新打开它时,这些信息应该会出现在标签中。我知道有sqlite3和mysql,但我不知道如何将其应用到python/kivy代码中。
请任何人告诉我怎么做。
如果可以举个例子,那就太完美了。
提前谢谢,
我的密码:

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

lg40wkob1#

当然,您可以使用sqlite3,但是存储kivy应用程序的基本数据的最简单方法(如示例)是将json文件与kivy自己的jsonstore类一起使用。它的好处是根据文件部署的平台将文件分配到正确的位置,您无需关心具体位置。
下面是一个简单的示例,使用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”:“上次运行时编写的内容”}。在这个简单的例子中,嵌套dict没有多大意义,但一般来说,对于实际应用程序来说,它正是您想要的,比如,如果您想为多个联系人获取联系人数据,或者您希望为应用程序本身存储多个小部件的各种配置(在本例中,您可能希望在加载小部件之前读取(get())数据,可能是在app类的build()方法中)。
参考文献:https://kivy.org/docs/api-kivy.storage.html

相关问题