2016-04-19 24 views
0

Ich mache eine Android-App mit Python und Kivy, die Diabetes-Einträge verfolgt und eine grundlegende Profilseite hat. Ich habe herausgefunden, wie man Eingaben von Texteingabe-Widgets in eine JSON-Datei speichert, was gut funktioniert. Allerdings kann ich nicht herausfinden, wie diese Informationen beim Start automatisch in den Textinput geladen werden. Laden in die Etiketten könnte auch funktionieren, aber es wäre schlampiger. Ich weiß, dass es ein on_start Modul gibt, aber ich habe keine Idee, wie man es benutzt. Irgendwelche Vorschläge würden sehr geschätzt werden.Wie man automatisch Daten aus der JSON-Datei beim Start mit kivy lädt

.kv Datei

<Phone>: 
result: _result 
h: _h 
w: _w 
n: name_input 
g: gender_input 
t: _type 
ti: _times 
m: _meds 





AnchorLayout: 
    anchor_x: 'center' 
    anchor_y: 'top' 

    ScreenManager: 
     size_hint: 1, .9 
     id: _screen_manager 
     Screen: 
      name: 'home' 
      canvas.before: 
       Rectangle: 
        pos: self.pos 
        size: self.size 
        source: "/home/aaron/Desktop/main.png" 
      Label: 
       markup: True 
       text: '[size=100][color=ff3333]Welcome to [color=ff3333]Diabetes Manager[/color][/size]' 
     Screen: 
      name: 'menu' 
      GridLayout: 
       cols: 2 
       padding: 50 
       canvas.before: 
        Rectangle: 
         pos: self.pos 
         size: self.size 
         source: "/home/aaron/Desktop/main.png" 

       Button: 
        text: 'My Profile' 
        on_press: _screen_manager.current = 'profile' 
       Button: 
        text: 'History' 
        on_press: _screen_manager.current = 'history'  

       Button: 
        text: 'New Entry' 
        on_press: _screen_manager.current = 'new_entry' 
       Button: 
        text: 'Graph' 
        on_press: _screen_manager.current = 'graph' 
       Button: 
        text: 'Diet' 
        on_press: _screen_manager.current = 'diet' 
       Button: 
        text: 'Settings' 
        on_press: _screen_manager.current = 'settings' 

     Screen: 
      name: 'profile' 
      GridLayout: 
       cols: 1 
       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Name[/color][/size]' 
        TextInput: 
         id: name_input 
         hint_text: 'Name' 
        Button: 
         size_hint_x: 0.15 
         text: 'Load' 
         on_press: root.load() 



       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Gender[/color][/size]' 
        TextInput: 
         id: gender_input 
         hint_text: 'Gender' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=34][color=0000ff]Type of Diabetes[/color][/size]' 
        TextInput: 
         id: _type 
         hint_text: 'Type of Diabetes' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Height (in)[/color][/size]' 
        TextInput: 
         id: _h 
         hint_text: 'Height in inches' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Weight (lb)[/color][/size]' 
        TextInput: 
         id: _w 
         hint_text: 'Weight in pounds' 

       BoxLayout: 
        Button: 
         text: 'Calculate BMI' 
         on_press: root.product(*args) 

        Label: 
         size_hint_x: 4.5 
         id:_result 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]BMI[/color][/size]' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=30][color=0000ff]List of Medications[/color][/size]' 
        TextInput: 
         id: _meds 
         hint_text: 'List of Medications' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=38][color=0000ff]Insulin Times[/color][/size]' 
        TextInput: 
         id: _times 
         hint_text: 'Please Enter Times to Take Insulin' 

        Button: 
         size_hint_x: 0.15 
         text: 'Done' 
         on_press: root.save() 


     Screen: 
      name: 'history' 
      GridLayout: 
       cols:1 

     Screen: 
      name: 'new_entry' 
      GridLayout: 
       cols:1 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Time[/color][/size]' 
        TextInput: 
         id: _time 
         hint_text: 'Current Time' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=28][color=0000ff]Blood Sugar (mg/dL)[/color][/size]' 
        TextInput: 
         id: _glucose_reading 
         hint_text: 'Current Blood Sugar' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=40][color=0000ff]Carbs[/color][/size]' 
        TextInput: 
         id: _food 
         hint_text: 'Total Carbs for meal' 

       BoxLayout: 
        Label: 
         size_hint_x: 0.22 
         bold: True 
         markup: True 
         text: '[size=30][color=0000ff]Medications Taken[/color][/size]' 
        TextInput: 
         id: _meds_taken 
         hint_text: 'Please Enter Any Medications Taken' 


     Screen: 
      name: 'graph' 
      GridLayout: 
       cols: 3 
       padding: 50 
      Label: 
       markup: True 
       text: '[size=24][color=dd88ff]Your Graph[/color][/size]' 

     Screen: 
      name: 'diet' 
      GridLayout: 
       cols: 3 
       padding: 50 
      Label: 
       markup: True 
       text: '[size=24][color=dd88ff]Reccomended Diet[/color][/size]' 


     Screen: 
      name: 'settings' 
      GridLayout: 
       cols: 3 
       padding: 50 
      Label: 
       markup: True 
       text: '[size=24][color=dd88ff]Settings[/color][/size]' 


AnchorLayout: 
    anchor_x: 'center' 
    anchor_y: 'bottom' 
    BoxLayout: 
     orientation: 'horizontal' 
     size_hint: 1, .1 
     Button: 
      id: btnExit 
      text: 'Exit' 
      on_press: app.save(_name.text, gender.txt) 
     Button: 
      text: 'Menu' 
      on_press: _screen_manager.current = 'menu' 

Py

from kivy.app import App 
    from kivy.lang import Builder 
    from kivy.uix.popup import Popup 
    from kivy.uix.button import Button 
    from kivy.graphics import Color, Rectangle 
    from kivy.uix.boxlayout import BoxLayout 
    from kivy.uix.floatlayout import FloatLayout 
    from kivy.uix.image import AsyncImage 
    from kivy.uix.label import Label 
    from kivy.properties import StringProperty, ListProperty 
    from kivy.uix.behaviors import ButtonBehavior 
    from kivy.uix.textinput import TextInput 
    from kivy.network.urlrequest import UrlRequest 
    from kivy.storage.jsonstore import JsonStore 
    from os.path import join 
    from os.path import exists 
    from kivy.compat import iteritems 
    from kivy.storage import AbstractStore 
    from json import loads, dump 
    from kivy.config import Config 



class Phone(FloatLayout): 
    def __init__(self, **kwargs): 
     # make sure we aren't overriding any important functionality 
     super(Phone, self).__init__(**kwargs) 

    with self.canvas.before: 
     Color(0, 1, 0, 1) # green; colors range from 0-1 instead of 0-255 
     self.rect = Rectangle(size=self.size, pos=self.pos) 

    self.bind(size=self._update_rect, pos=self._update_rect) 

def _update_rect(self, instance, value): 
    self.rect.pos = instance.pos 
    self.rect.size = instance.size 

def product(self, instance): 
    self.result.text = str(float(self.w.text) * 703/ (float(self.h.text) * float(self.h.text))) 

def save(self): 
    store = JsonStore('hello.json') 
    name = self.n.text 
    gender = self.g.text 
    dtype = self.t.text 
    height = self.h.text 
    weight = self.w.text 
    medications = self.m.text 
    store.put('profile', name=name, gender=gender, dtpe=dtype, height=height, weight=weight, medications=medications) 


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

class PhoneApp(App): 
    def build(self): 
     store = JsonStore('hello.json') 

     return Phone() 



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

Antwort

0

Sie tun genau das Gegenteil von dem, was Sie bereits in save() tun. Zum Beispiel:

def load(self): 
    store = JsonStore('hello.json') 
    profile = store.get('profile') 
    self.n.text = profile['name'] 
    self.g.text = profile['gender'] 
    ... 

Dann rufen Sie einfach die Methode irgendwo, wie in __init__().

+0

Danke, das funktioniert gut, wenn ich es mit einer Lade-Taste getestet habe, aber wie würde ich rekursiv in der Telefonklasse anrufen? – Azaro

+0

versteh nie es herausgefunden, danke! – Azaro

+0

Alles funktioniert gut, wenn ich einige Informationen in der JSON-Datei habe, aber wenn ich die Informationen in der JSON-Datei lösche, dann stürzt es beim Start ab – Azaro