使用Kivy显示JSON文件中的数据

时间:2019-01-16 17:52:41

标签: json python-3.x kivy

我有一个基于用户输入创建json文件的程序。我试图显示“用户”信息,以便用户知道他们已经创建了一个配置文件(这将显示在“加载配置文件”下)。我尝试使用recycleview,listview,甚至尝试创建自己的表来完成这项工作。我看了有关recycleview(非常令人困惑)和listview(也很令人困惑)的文档。我没有足够的经验来弄清楚技术性。我搜索了一系列的堆栈流问题和youtube教程,但没有一个真正说明如何使用json文件中的数据。有人可以帮我解决这个问题吗?

main.py

from kivy.app import App
from kivy.storage.jsonstore import JsonStore
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window
from tinydb import TinyDB, Query, where
from kivy.properties import ListProperty


Window.clearcolor = (0.02745098, 0.074509804, 0.121568627, 1)
Window.size = (2000, 900)

db = TinyDB('bcodb.json')

class TitleScreen(Screen):
    pass

class MainScreen(Screen):
    pass

class CreateProfile(Screen):
    def __init__(self, **kwargs):
        super(CreateProfile, self).__init__(**kwargs)
        self.store = JsonStore("bcodb.json")

    def save(self):
        db.insert({'first': self.first.text, 'middle': self.middle.text, 'last': self.last.text})


    def update(self):
        db.update({'first': self.first.text, 'middle': self.middle.text, 'last': self.last.text})


class LoadProfile(Screen):
    rows = ListProperty([("First", "Middle", "Last")])

    def __init__(self, **kwargs):
        super(LoadProfile, self).__init__(**kwargs)
        self.store = JsonStore("bcodb.json")

    def load(self):
        if db.search(where('last') == self.last.text):
            print(self.rows)
        else:
            print("not found")

    def delete(self):
        db.remove({'first': self.first.text, 'middle': self.middle.text, 'last': self.last.text})

class CreatePacket(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass



presentation = Builder.load_file("customwidget2.kv")

class CustomWidgetApp(App):
    def build(self):
        return presentation

if __name__ == "__main__":
    CustomWidgetApp().run()

.KV

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
#: import hex kivy.utils.get_color_from_hex
#: import FocusBehaviors kivy.uix.behaviors.focus

ScreenManagement:
    transition: FadeTransition()
    TitleScreen:
    MainScreen:
    CreateProfile:
    LoadProfile:
    CreatePacket:

<MainLabel@Label>:
    font_size:50
    bold: True
    size_hint_x: 1
    size_hint_y: 1.85
    color: 0.396078431, 0.803921569, 0.807843137, 1
    font_name: './pirulen rg.ttf'

<SubLabel@Label>:
    font_size: 35
    bold: True
    halign: "center"
    size_hint_x: 1
    size_hint_y: 1.5
    color: 0.396078431, 0.803921569, 0.807843137, 1
    font_name: './pirulen rg.ttf'

<OtherLabel@Label>:
    font_size: 12
    bold: True
    color: 0.396078431, 0.803921569, 0.807843137, 1
    font_name: './pirulen rg.ttf'
    text_size: self.size

<Button@Button>:
    font_size: 20
    bold: True
    color: 0.396078431, 0.803921569, 0.807843137, 1
    font_name: './pirulen rg.ttf'
    background_color: 0.02745098, 0.074509804, 0.121568627, .01
    canvas.before:
        Color:
            rgba: 0.396078431, 0.803921569, 0.807843137, 1
        Line:
            width: 2
            rectangle: self.x, self.y, self.width, self.height
    on_press: self.background_color = (0.396078431, 0.803921569, 0.807843137, 1)
    on_release: self.background_color = (0.02745098, 0.074509804, 0.121568627, .01)

# TODO: Create a focus behavior to "Tab" between widgets
<TextInput@TextInput>:
    font_size: 12
    color: 0.396078431, 0.803921569, 0.807843137, 1
    font_name: './pirulen rg.ttf'
    padding_x: 10
    padding_y: 10
    focus_next: None
    focus_previous: None
    unfocus_on_touch: True
    background_color: 0.02745098, 0.074509804, 0.121568627, .01
    canvas.before:
        Color:
            rgba: 0.396078431, 0.803921569, 0.807843137, 1
        Line:
            width: 1
            rectangle: self.x, self.y, self.width, self.height

<TitleScreen>:
    id: "title"
    FloatLayout:
        MainLabel:
            text: "Easy Button"
            size_hint_x: 1
            size_hint_y: 1.25

        SubLabel:
            text: 'Test'
            size_hint_x: 1
            size_hint_y: 1
        Button:
            text: "Click Here To Continue"
            on_release: app.root.current = "main_screen"
            size_hint: (.75, .15)
            pos_hint: {'x': .12, 'y': .2}

<MainScreen>:
    name: "main_screen"
    MainLabel:
        text: "Home Page"

    FloatLayout:
        Button:
            on_release: app.root.current = "create_profile"
            text: "Create Profile"
            size_hint: (.5, .15)
            pos_hint: {'x': .23, 'y': .65}

        Button:
            on_release: app.root.current = "load_profile"
            text: "Load Profile"
            size_hint: (.5, .15)
            pos_hint: {'x': .23, 'y': .45}

        Button:
            on_release: app.root.current = "create_packet"
            text: "Create Packet"
            size_hint: (.5, .15)
            pos_hint: {'x': .23, 'y': .25}

<CreateProfile>:
    name: "create_profile"

    first: first
    middle: middle
    last: last

    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'top'
        MainLabel:
            text: "Create Profile"
            size_hint: (1, .15)



    BoxLayout:
        size_hint: (.95, .2)
        pos_hint: {'x': 0, 'y': .85}
        spacing: 10
        padding: 10
        halign: "left"

        OtherLabel:
            text: "First"

        OtherLabel:
            text: "Middle"

        OtherLabel:
            text: "Last"
    BoxLayout:
        size_hint: (.95, .07)
        pos_hint: {'x': 0, 'y': .8}
        spacing: 20
        padding: 10
        halign: "right"
        text_size: self.size
        TextInput:
            id: first
        TextInput:
            id: middle
        TextInput:
            id: last

    BoxLayout:
        Button:
            on_release: app.root.current = "main_screen"
            text: "back Home"
            size_hint: (.5, .15)
        Button:
            on_release: root.save()
            text: "Save Profile"
            size_hint: (.5, .15)

<LoadProfile>:
    name: "load_profile"
    first: first
    middle: middle
    last: last

    AnchorLayout:
        anchor_x: 'center'
        anchor_y: 'top'
        MainLabel:
            text: "Load Profile"
            size_hint: (1, .15)

    BoxLayout:
        size_hint: (.95, .2)
        pos_hint: {'x': 0, 'y': .85}
        spacing: 10
        padding: 10
        halign: "left"

        OtherLabel:
            text: "First"

        OtherLabel:
            text: "Middle"

        OtherLabel:
            text: "Last"

    BoxLayout:
        size_hint: (.95, .07)
        pos_hint: {'x': 0, 'y': .8}
        spacing: 20
        padding: 10
        halign: "right"
        text_size: self.size
        TextInput:
            id: first
        TextInput:
            id: middle
        TextInput:
            id: last

    BoxLayout:
        size_hint: (.95, .2)
        pos_hint: {'x': .4, 'y': .75}
        spacing: 10
        padding: 10
        halign: "left"


    GridLayout:
        cols: 3
        size_hint_x: None
        pos_hint_y: .75
        OtherLabel:
            text: "Created Profiles"

    BoxLayout:
        Button:
            on_release: app.root.current = "main_screen"
            text: "back Home"
            size_hint: (.5, .15)
        Button:
            on_release: root.load()
            text: "Load Profile"
            size_hint: (.5, .15)


<CreatePacket>:
    name: "create_packet"
    MainLabel:
        text: "Select Packet"
    FloatLayout:
        Button:
            on_release: app.root.current = "main_screen"
            text: "back Home"
            size_hint: (1, .15)

当前加载页面

enter image description here

使用此程序时,请导航至创建配置文件并输入一些信息。这将创建名为“ bcodb.json”的json文件

预先感谢您的帮助

0 个答案:

没有答案