Kivy Json Storage, geänderte Value schreiben

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Hallo Schlangenmenschen ;)

Ich bin immer noch in der Einarbeitung in Python und Kivy. Dabei hänge ich gerade im Grundverständnis etwas fest. Ggf könnt ihr mir helfen.
Ich nutze den Kivy Json Storage um eine json Datei zu bearbeiten.
Dabei habe ich folgendes Problem:

Das Test jsonfile sieht wie folgt aus:

Code: Alles auswählen

{
	"publickey": "",
	"privatekey": "",

	"key": "1BLL5NFY-KCSUOHBN",
	"secret": "fa3b7826ad",

	"b-key": "c7f25364559b497092e5e00b1d119169",
	"b-secret": "a7c51baa066242c4be9fe73666fe2e8c"

}
Szenario 1

Code: Alles auswählen

from kivy.storage.jsonstore import JsonStore

jsonfile = '..\\config\\config2.json'

stage = JsonStore(jsonfile, indent=4, sort_keys=False)

a= stage.keys()
print(a)        #>>> dict_keys(['publickey', 'privatekey', 'key', 'secret', 'b-key', 'b-secret'])
print(stage.get('key')) #>>> 1BLL5NFY-KCSUOHBN
b = stage.put("key", "asdasd") #>>> TypeError: put() takes 2 positional arguments but 3 were given 
print(stage.get("key"))
Mir erklärt sich nicht ganz wieso ein stage.put() nur Self, Key, und kein Value zugelassen wird. Im Szenario 2 wiederum schon.
Denn nach langen Testen habe ich folgendes Szenario zusammengebastelt. Das Funktioniert zwar aber ich verstehe nicht wieso Szenario 1 nicht möglich ist.

Code: Alles auswählen

from kivy.storage.jsonstore import JsonStore

jsonfile = '..\\config\\config2.json'

stage = JsonStore(jsonfile, indent=4, sort_keys=False)

a= stage.keys()
print(a)        #>>> dict_keys(['publickey', 'privatekey', 'key', 'secret', 'b-key', 'b-secret'])
print(stage.get('key')) #>>> 1BLL5NFY-KCSUOHBN
stage.store_put("key", "asdasd") # Eigentlich gleiche Funktion wie stage.put() nur kommt kein Argumenten Fehler
print(stage.get("key")) #>>> asdasd  # Value geändert aber nur im Storage datei nicht beschrieben
stage.put("fileversion", version=0.1) #>>> json wird mit geänderte Daten geschrieben
Herraus kommt dann dieses Jsonfile

Code: Alles auswählen

{
    "publickey": "",
    "privatekey": "",
    "key": "asdasd",
    "secret": "fa3b7826ad",
    "b-key": "c7f25364559b497092e5e00b1d119169",
    "b-secret": "a7c51baa066242c4be9fe73666fe2e8c",
    "fileversion": {
        "lastwritetime": 0.1
    }
}
Ich habe mir mit einen neuem Key "fileversion" beholfen. Dann ändert er zwar das value von dem "Key" (welcher vorher nur im stage.store_put gespeichert war) aber das ist nicht ganz Sinn und Zweck meines Scriptes.
Hab ihr eine Idee wo mein Fehler liegt? Wie kann ich den Key direkt mit stage.put beschreiben?

Danke
Tholo
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

put ist anders definiert. Statt zwei Werten "key", "value" nimmt es *Keyword*-Argumente: stage.put(key="value")

Nachtrag: dadurch kannst du natuerlich auch mehrere gleichzeitig setzen: put(foo="bar", baz="bamm")
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Laut Doco ist

Code: Alles auswählen

storage.put(key, **values)


Wenn ich

Code: Alles auswählen

stage.put(key='key: "xcvbrfgkj"')
kommt

Code: Alles auswählen

 "key: \"xcvbrfgkj\"": {}
herraus.

Bei

Code: Alles auswählen

stage.put(key="xcvbrfgkj")
kommt

Code: Alles auswählen

"xcvbrfgkj": {}
Ich möchte aber folgenden Syntax ja erreichen

Code: Alles auswählen

"key": "xcvbrfgkj",
Ich hab zur Veranschaulichung mal ein anderen Key genutzt

Code: Alles auswählen

stage.put(secret="afsd")

Code: Alles auswählen

stage.put(secret="afsd")
 TypeError: put() missing 1 required positional argument: 'key'


Wo liegt nun mein Fehler?
Sorry ich hab das Prozedere einfach noch nicht verstanden.

TanteEdit:
Docu von .put
def put(self, key, **values) Inferred type: (self: AbstractStore, key: Any, values: Dict[str, Any]) -> Any
Put new key-value pairs (given in values) into the storage. Any existing
Hier steht values:Dict[str,Any]
Bei store_put allerdings
def store_put(self, key, value) Inferred type: (self: JsonStore, key: Any, value: Any) -> bool
value: Any

Kann es sein das die reine .put Funktion keinen einzelnen String zulässt?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Nee. Ich hab’s auch missverstanden. Es soll wohl

put(key=„key“, value=„value“)

sein. Etwas seltsam.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

So, nochmal geschaut. Sehr verwirrend das alles.

Die scheinen einen etwas abstrakteren Store-Begriff zu benutzen, wahrscheinlich, weil sie auch andere Backends als JSON anbieten.

Es scheint so, als ob immer ein "store" angegeben werden muss bei put. Der koennte zB ein Programmname sein. Und darunter dann kommen die eigentlichen Werte. Das Ergebnis ist also immer ein Dict, mit weiteren dicts als Werten.

Code: Alles auswählen

from kivy.storage.jsonstore import JsonStore
jsonfile = '/tmp/test.json'
stage = JsonStore(jsonfile)
stage["foo"] = { "hello" : "peter" }
stage.put("foo", hello="anna")
[codebox=javascript file=Unbenannt.js]{"foo": {"hello": "anna"}}[/code]
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Den Store welchen du meinst, habe ich auch bezeichnet. Sogar mit der gleichen Variabel "Stage".
Was ich blos nicht verstehen kann, wieso der Umweg über stage.store_put() die Value gleich ändert. Allerdings ist sie dort ja nur in Python selbst geändert nicht im Json File

Code: Alles auswählen

from kivy.storage.jsonstore import JsonStore
 
jsonfile = '..\\config\\config2.json'
 
stage = JsonStore(jsonfile, indent=4, sort_keys=False)
 
a= stage.keys()
print(a)        #>>> dict_keys(['publickey', 'privatekey', 'key', 'secret', 'b-key', 'b-secret'])
print(stage.get('key')) #>>> 1BLL5NFY-KCSUOHBN
stage.store_put("key", "asdasd")
stage.put("fileversion", version=0.1)
Ich möchte halt eine Jsonfile ändern welches nicht zu meinem Script gehört. Daher bin ich an den Syntax gebunden.
Ich danke dir trotzdem __deets__ für die Mühe!!
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

Ich hab es jetzt wie folgt gelößt

Code: Alles auswählen

from kivy.storage.jsonstore import JsonStore
from time import time

jsonfile2 = '..\\config\\config2.json' #Pfad zur Json Datei

class JsonClass():
    def __init__(self, b):
        self.b = JsonStore(b, indent=4, sort_keys=False)

    def readjsonfile(self):
        self.b.keys()
        print(self.b.keys())
        print("alte keys")        #gibt erst gelesene Keys aus

    def changejsonvalue(self, key, val):
        self.b.store_put(key, val)  # speichert Keys und/oder value Änderungen im Ram
        print(self.b.store_get(key)) # Gibt Änderung aus
        self.writejson()                  # siehe writejson

    def writejson(self):             #speichert Änderungen im Jsonfile
        self.t = time()                 #aktuelle Zeit in Unixtime
        self.b.put("SBGuifileversion", lastwritetime=self.t)          # Schreibt Änderungen Keys und/oder values, zusammen mit Unixtime in die Json

args = JsonClass(jsonfile2)       # kann variable Jsondateipfade behandeln
args.readjsonfile()
args.changejsonvalue(key="secret", val="123123")
Output

Code: Alles auswählen

dict_keys(['publickey', 'privatekey', 'key', 'secret', 'b-key', 'b-secret', 'SBGuifileversion'])
alte keys
123123
Json gespeichert
Json Datei
Antworten