Отображение данных из файла JSON с использованием Kivy - PullRequest
0 голосов
/ 16 января 2019

У меня есть программа, которая создает файл 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

Когда вы используете эту программу, перейдите к созданию профиля и введите некоторую информацию. Это создаст файл json с именем 'bcodb.json'

Заранее благодарю за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...