colors aus xml auslesen

  • grüße

    ich möchte ein script erstellen, damit man die farben anhand der default.xml aus dem skinpfad ändern kann.

    hat von euch schon mal wer eine xml datei per python die werte in ein array ausgelesen?
    oder habt ihr vllt nen tipp?

    möchte das ganze dann per select dialog zur auswahl bringen.

  • was dann vllt auch noch cool wäre, wenn man noch weitere farben hinzufügen kann.

  • im grunde werden es zwei arrays.

    das erste für die namen. was dann auch zum aufruf des select dialog genommen werden kann.
    das zweite für die werte.

    wenn dann im dialog selektiert wurde, dann soll ein skinstring mit dem name gesetzt werden.
    und der string kann ja dann für z.B. textcolor genutzt werden.


    um das ganze dann mal zu erweitern:
    soll auch ein eintrag "custom" oder "neu" mit ins array, wenn man dann per schieberegler eine farbe setzen kann. aber dafür müsste ich erst einen dialog schustern.
    und dann ggf. mit in die xml speichern.
    aber bin zufrieden, wenn schon mal das lesen der xml klappt.

  • Du könntest die ganze Sache in ein Dictionary packen und dann hast du Schlüsselwörter mit einem entsprechenden Wert!

    Du könntest mit den Schlüsseln auf die Werte zugreifen!
    Neue Hinzufügen Löschen und die Werte ändern

    print Farben['grey'] würde die z.B den Wert von grau ausgeben
    mit del Dictionary Name[Schlüssel] kannst du ein Paar löschen
    oder z.B mit Dictionary Name[Schlüssel] = Neuer Wert einen neuen Wert den Schlüssel geben usw.


    Python
    import re
    Farben={}
    xml='<?xml version="1.0" encoding="utf-8"?><colors><color name="white">FFFFFFFF</color><color name="grey">FFb4b4b4</color><color name="grey2">FF999999</color><color name="grey3">FF505050</color><color name="black">FF000000</color><color name="blue">FF0084ff</color><color name="selected">FFEB9E17</color><color name="bmwamber">FFFF7E00</color></colors>'
    
    
    match=re.findall('name="(.*?)">(.*?)</',xml)
    for farbe,wert in match:
       Farben[farbe] = wert
    print Farben

    Wäre das mit einem Dictionary nicht sogar besser?

  • ist dictionary ein xml parser?
    das mit dem array hast du nicht ganz verstanden.
    so z.b. soll es aussehen:
    farbe[white, red, blue]
    wert[FFFFFFFF, FFFF0000, FF0000FF] (sofern ich das jetzt richtig gesetzt hab)
    ah, ich glaub das ist kein array, sondern ne liste.

    @Dima
    ja die farben kann man dann berechnen, wenn die schieberegler RGB entsprechend eingestellt sind.
    das sehe ich nicht so schwer.
    da hab ich beim parsen von xml mehr probleme.

  • Nein ein Dateityp in Python wie Strings Listen usw.
    Das gute ist das Du nicht ein Index hast der von 0 beginnt sondern auf die Werte eines Dictionarys mit einem Key (Schlüssel zugreifen kannst .

    In den Python code im Beispiel .Habe ich Deine Beispiel xml mit re geparst (regex) und
    den Namen der Farbe und den Wert in in ein Dictionary mit den Namen Farben geschrieben.
    wobei der Farben Name dann ein Schlüssel Wurde und einen entsprechenden Wert hält.
    Wie gesagt du kannst die einzelnen Werte der Farben ansprechen., ein Schlüssel mit Wert löschen neue Hinzufügen den wert einer farbe ändern.
    Nur die Farben ausgeben oder nur die Werte ausgeben. usw.

  • farbe[white, red, blue]
    wert[FFFFFFFF, FFFF0000, FF0000FF] (sofern ich das jetzt richtig gesetzt hab)
    ah, ich glaub das ist kein array, sondern ne liste.

    Ja das sind 2 Listen , die hast Du durch das erstellen des Dictionary auch
    print Farben.keys()
    würde dir nur die Farben in der Art zurückgeben [white, red, blue]
    mit print Farben..values() würdest Du eine Liste der Werte erhalten.

    Die Manipulationsmöglichkeiten sind trotzdem wie im Post davor beschrieben vorhanden.

    im Prinzip könntest Du 2 Variablen erstellen die diese Listen halten.

    Farbliste=Farben.keys()
    Farbwerte=Farben.values()

    und dann über diese Variablen auf die entsprechenden Listen zugreifen.


    Ich muß jetzt erst bei meinen Addon Tutorial weitermachen .
    Dag eht es heute um Dictionarys und Schleifen.
    Listen waren im Teil4 dran .
    Kannst ja mal reinschauen wenn Du Lust hast.


    Gruß Jan

  • wie soll ichs jetzt erklären, die listposition sollte mit 0 beginnen, weil der rückgabewert vom dialog auch mit 0 beginnt.

    entsprehend so:
    Farbe[0] = white
    Farbe[1] = red
    Farbe[2] = blue

    Wert[0] = FFFFFFFF
    Wert[1] = FFFF0000
    Wert[2] = FF0000FF

    ich versuch das jetzt mal einzulesen.

  • Wenn du die Postion auf eine Liste beziehst ist das Richtig aber das Dictionary was ich erstellt habe heißt Farben .

    und die keys sind z.B white ,red,blue
    print Farben['white']
    >>>FFFFFFFF Ausgabe

    Vielleicht ist das so besser zu verstehen.


    Gruß Jan

  • Danke für deine Hilfe.
    Da der string "color" nicht geprüft wird, könnte doch unter umständen auch mal eine "nicht farbe" ausgelesen werden, weil ja nur name gecheckt wird, oder?

    So schaut es zur Zeit aus (muss noch etwas aufräumen):

  • also so wie ich das jetzt verstanden habe, ist es kein xml parser, sondern es werden die strings gesucht.
    das mit dem findall und der for scheife check ich irgendwie nicht. aber es läuft zumindest.

    und zu guter letzt, wenn ich jetzt zum dictionary was hinzufüge, wie wird dann da wieder die xml datei draus.
    ich glaub einfach die datei speichern macht da was ganz anderes draus.

  • ja ,es ist kein XML Parser.
    XML Parser sind Python Module die nur für diesen Zweck geschrieben sind.
    sie verbrauchen mehr Platz als der alleinig Import von re.
    Ein reges sucht im Prinzip ein Muster.
    Wenn Du die XML Über Python öffnen und eine neue XML mit neuen Farben schreiben willst wird es etwas kompliziiert.
    mit re.findall suchst du das Muster (den Reges) in der Datei einen Steing oder was auch immer in diesen Fall eine XML.

    For leitet eine Schleife ein .

    Gruß Jan

    Entschuldige , hoffe kannst einigermaßen das lesen.
    bin hier am Android Tablet.

    Wir können gerne Morgen nochmal schreiben.
    Heute muß ich ins Bett .
    Muß Morgens früh raus.

    Gruß Jan

  • also wenn man 'name=' durch 'color name=' ersetzt, dann sollte zumindest das erwähnte problem behoben sein.

    dass schleifen mit for anfangen ist mir bekannt. aber die definition ist mir völlig unbekannt.
    farbe und wert sind doch völlig unbekannte variablen. check ich nicht....
    hab mich ehrlich gesagt auch noch nicht so mit for schleifen in python beschäftigt.
    bisher nur mal ne kleine while():

  • mit Farben={} definiere ich ein leeres Dictionary mit den Namen Farben

    in der match suche ich über re.findall mit dem Regex name="(.*?)">(.*?)</ in der xml
    Das (.*?) bedeutet das ich diese Sachen Auslese denn es sind die 2 Sachen die für dich relevant sind.

    Würde ich match mit print match ausgeben.
    Würdest Du folgendes sehen:

    [('white', 'FFFFFFFF'), ('grey', 'FFb4b4b4'), ('grey2', 'FF999999'), ('grey3', 'FF505050'), ('black', 'FF000000'), ('blue', 'FF0084ff'), ('selected', 'FFEB9E17'), ('bmwamber', 'FFFF7E00')]

    in der for schleife definiere ich die Variablen
    for farbe,wert in match:

    Die Schleife läuft dann über match und ordnet in den durchläufen farbe und wert zu .
    Als Beispiel ein Durchlauf:
    ('white', 'FFFFFFFF') farbe =white , wert=FFFFFFFF

    in der nächsten Zeile fülle ich das leere Dictionary Farben mit Schlüssel und Wert Paar:
    Farben[farbe] = wert

    Beim ersten Durchlauf der Schleife sieht das dann zum besseren Verständnis so aus:
    Farben['white']='FFFFFFFF'
    Beim nächsten Durchlauf der Schleife wird die nächste Farbe mit Wert hinzugefügt usw.

    Ist der Durchlauf beendet hält das Dictionary alle Farben als Schlüssel und den dazugehörenden Wert

    Gruß Jan

  • ok, so langsam komm ich mit.

    Edit:
    so müsste es für findall aussehen, wenn ich ein attribut hinzufüge, damit ich definieren kann, welche farben es sein sollen?

    Code
    <color name="white" menutextcolor="true">FFFFFFFF</color>
    Code
    match=re.findall('name="(.*?)" menutextcolor="true">(.*?)</',xml)

    Aber jetzt noch ne andere frage. wenn die skin neu geladen wird, dann ist ja der string noch leer, also keine farbe drin.
    Kann man da irgendwie ein default in den string setzen, oder geht das dann nur per variable?

  • verstehe jetzt noch nicht richtig was du jetzt machen willst!Bis jetzt hatten wir eine XML die du über den Script ein liest und darin die Farbe in den dazugehörigen Wert erfasst .Was hast du jetzt vor?
    Ich nehme an du hast einen GUI mit dem du die Farbe dann auswählen kannst.
    Funktioniert das jetzt schon so und du kannst die Farbe wählen und sie wird im Skin dann auch gesetzt?
    Wenn ja was soll jetzt passieren.?
    Ist diese XML beim Start des Skins vorhanden und hält die Farben und den Wert wie in der Beispiel XML?
    Oder ist diese XML vorhanden und hält noch nichts?
    Oder ist diese XML beim Start des Skins nicht vorhanden ?
    Oder willst du ein neue XML erzeugen die dann die ausgewählte Farbe aus deinem GUI hält?

    Bis Morgen Jan

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!