1. mit der erweiterung menutextcolor="true" kann ich separieren welche farben ich hernehmen will, ohne dass die anderen berücksichtigt werden. weil die brauch die skin ja ebenfalls, aber machen sich als textfarbe evtl. nicht so gut.
2. einie gui zum setzen einer custom farbe habe ich noch nicht. da brauch ich bissl mehr zeit.
3. wenn die custom farbe gewählt wurde, wäre es cool, wenn man sie in die xml speichern und löschen kann.
4. ja, das auswählen funktioniert.
5. die xml ist immer bei einer skin vorhanden, weil das die colors für die skin sind.
6. nur eben wenn die skin gewechselt wird, dann wird sie ja mit standardwerten geladen. und da ist der skinstring noch nicht gesetzt. nach einmaligen setzen merkt sich kodi den skinstring ja. sprich, die farbe wird gehalten.
colors aus xml auslesen
-
harryberlin -
15. November 2015 um 13:00 -
Erledigt
-
-
1. mit der erweiterung menutextcolor="true" kann ich separieren welche farben ich hernehmen will, ohne dass die anderen berücksichtigt werden. weil die brauch die skin ja ebenfalls, aber machen sich als textfarbe evtl. nicht so gut.
Wie würde die xml dann aussehen?
3. wenn die custom farbe gewählt wurde, wäre es cool, wenn man sie in die xml speichern und löschen kann.
Wie ist die Syntax der Xml und wo soll in dieser xml die gewähle Farbe eingesetzt werden.
-
-
Hey,
Ich will euch nicht aus dem Konzept bringen, aber was ist denn genau die zu erreichende Funktion des ganzen?
Soll die colors.xml dann in verschiedenen Skins oder auf verschiedenen Rechnern genutzt werden?
Nicht das hier ein Missverständnis auf Skin Engine Ebene vorliegt..5. die xml ist immer bei einer skin vorhanden, weil das die colors für die skin sind.
6. nur eben wenn die skin gewechselt wird, dann wird sie ja mit standardwerten geladen. und da ist der skinstring noch nicht gesetzt. nach einmaligen setzen merkt sich kodi den skinstring ja. sprich, die farbe wird gehalten.Eine Fabre in der Colors xml muss nur definiert werden wenn sich auch über diese Definition aufgerufen wird.
Man kann seit Jarvis auch in der gesamten Skin engine endlich Variablen für Farben nutzen..
Das in der XML zu machen würde eigentlich nur Sinn ergeben wenn man es auf mehreren Rechner genau gleich haben will
beispielsweise wenn man die irgendwie synchronisiert.Ansonsten würde das im Skin dann in der Art gemacht werden:
XML<variable name="AC_value_dialog_color_focus"> <value condition="!IsEmpty(skin.string(dialog_color_focus))">FF$INFO[skin.string(dialog_color_focus)]</value> <value>AC_dialog_color_focus</value><!-- nocolor --> </variable>
Diese Farbe wird dann in den einzelnen xml´s mitangesprochen. Sie fällt automatisch auf eine definierte Farbe der colors xml zurück.
Aber auch das ist nicht Notwendig.
Es könnte genauso gut so aussehen:
XML<variable name="AC_value_dialog_color_focus"> <value condition="!IsEmpty(skin.string(dialog_color_focus))">FF$INFO[skin.string(dialog_color_focus)]</value> <value>FF000000</value><!-- nocolor --> </variable>
Man kann sich also auch genauso gut eine eigene Einstellung im Skin Einbauen und mitoder ohne Wertangabe mittels Tastatur sogar jede beliebige Farbe setzen mit
Baut man sich also eine Liste mit zu definierenden Strings und eine mit den auszuwählenden Farben,
könnte man die auch im Skin definieren.
Fallbacks der Farben würden dann nur Verwended wenn keine definiert ist.Anders herum könnte man sich so genauso gut einen Button bauen der mehrere der Farben als "Profil" definiert.
Wenn ich z.B. dann 8 verschiedene Farben habe, könnte man die auf einmal mit 8 clicks in einem Button mit setstring auch
8 zusammenpassende Farben aufeinmal in die jeweiligen strings schreiben.Nur so als Klarstellung was alles im Skin möglich wäre.
Grüße
-
@marco0810
Ich kommt nicht ganz mit, wie bringe ich die farben dann zur auswahl?
wie schreibe ich die in die variable.xml?edit:
hab nochmal überlegt. du hast bissl zu viel infos gegeben.
ich könnte den string in der variablen nutzen. das ist ne gute idee.
jedoch das dauerhafte hinzufügen in die colors defaults.xml fehlt dann trotzdem.
und ich möchte natürlich auf einfachen wege lernen, wie man xml files liest und schreibt.@Jan
das script schaut so aus:Spoiler anzeigen
Python
Alles anzeigen#!/usr/bin/env python import xbmc, xbmcgui, xbmcaddon import re bDebug = False Farben={} xmlfile=xbmcaddon.Addon(xbmc.getSkinDir()).getAddonInfo('path').decode('utf-8') + '/colors/defaults.xml' xml = open(xmlfile, 'r').read() print xml match=re.findall('name="(.*?)" menutextcolor="true">(.*?)</',xml) for farbe,wert in match: Farben[farbe] = wert print Farben Farbliste=Farben.keys() Wertliste=Farben.values() print 'Farbe 0: ' + Farbliste[0] print Farben[Farbliste[0]] print Wertliste ret = xbmcgui.Dialog().select('Choose a Color', Farbliste) print 'selected: ' + Farbliste[ret] if bDebug: xbmcgui.Dialog().ok("Choosed color", Farbliste[ret]) if not ret < 0: xbmc.executebuiltin('Skin.SetString(MenuTextColor,' + Farbliste[ret] + ')') pass
meine color defaults.xml schaut so aus:
Spoiler anzeigen
XML
Alles anzeigen<?xml version="1.0" encoding="utf-8"?> <colors> <color name="white" menutextcolor="true">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" menutextcolor="true">FF0084ff</color> <color name="selected" menutextcolor="true">FFEB9E17</color> <color name="BMW Amber" menutextcolor="true">FFFF7E00</color> <color name="BMW M blue" menutextcolor="true">ff0072ce</color> <color name="BMW M darkblue" menutextcolor="true">ff0c2340</color> <color name="BMW M red" menutextcolor="true">ffc8102e</color> </colors>
und hier noch ein video von der ganzen action:
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt. -
-
hab nochmal überlegt. du hast bissl zu viel infos gegeben.
ich könnte den string in der variablen nutzen. das ist ne gute idee.
jedoch das dauerhafte hinzufügen in die colors defaults.xml fehlt dann trotzdem.
und ich möchte natürlich auf einfachen wege lernen, wie man xml files liest und schreibt.Naja, generell brauchst du auch nicht unbedingt eine Colors.xml
Bau dir einfach mal irgendwo in deinen Einstellungen oder sonst wo zwei Buttons..
Sag im click einfach
<onclick>Skin.SetString(Color1,FF41A1FB)</onclick>
Und im zweiten
<onclick>Skin.SetString(Color2,FFEB3C0D)</onclick>jetzt hast du zwei strings gesetzt die in deinen Skinsettings gespeichert sind..
Du kannst jetzt genauso gut eine Variable bauen die so aussieht und wenn string1 leer ist den zweiten nimmt für eine Farbe,Code<variable name="Testcolor"> <value condition="!IsEmpty(skin.string(Color1))">FF$INFO[skin.string(Color1)]</value> <value>Color2</value><!-- nocolor --> </variable>
oder aber auf deine Colors.xml verweisen wie oben Beschrieben, oder auf einen direkten HEX wert.
Ich wollt euch nur drauf Hinweisen das so etwas eigentlich im Skin auch super geht:
Du müsstest dir dann nur anstatt des Selectdialoges ein eigenes Custom Window bauen das genauso aussieht.
Mit einer Confluence Liste würde deine Liste dann so aussehen:
XML
Alles anzeigen<control type="list" id="3"> <left>20</left> <top>67</top> <width>550</width> <height>460</height> <onup>3</onup> <ondown>3</ondown> <onleft>99</onleft> <onright>61</onright> <pagecontrol>61</pagecontrol> <scrolltime>200</scrolltime> <itemlayout height="46" width="550"> <control type="image"> <left>0</left> <top>0</top> <width>550</width> <height>40</height> <texture border="5">button-nofocus.png</texture> </control> <control type="label"> <left>20</left> <top>0</top> <width>510</width> <height>40</height> <font>font13</font> <textcolor>grey2</textcolor> <selectedcolor>selected</selectedcolor> <align>left</align> <aligny>center</aligny> <label>$INFO[ListItem.Label]</label> </control> </itemlayout> <focusedlayout height="46" width="550"> <control type="image"> <left>0</left> <top>0</top> <width>550</width> <height>40</height> <texture border="5">button-nofocus.png</texture> <visible>!Control.HasFocus(3)</visible> <include>VisibleFadeEffect</include> </control> <control type="image"> <left>0</left> <top>0</top> <width>550</width> <height>40</height> <texture border="5">button-focus2.png</texture> <visible>Control.HasFocus(3)</visible> <include>VisibleFadeEffect</include> </control> <control type="label"> <left>20</left> <top>0</top> <width>510</width> <height>40</height> <font>font13</font> <textcolor>white</textcolor> <selectedcolor>selected</selectedcolor> <align>left</align> <aligny>center</aligny> <label>$INFO[ListItem.Label]</label> </control> </focusedlayout> <content> <item id="1"> <label>BMW M darkblue</label> <onclick>Skin.SetString(Color1,FFEB3C0D)</onclick> </item> <item id="2"> <label>xxx</label> <onclick>Skin.SetString(Color1,FF41A1FB)</onclick> </item> <content> </control>
und mit der Variablen von oben analog dazu einfach
Code<variable name="Testcolor"> <value condition="!IsEmpty(skin.string(Color1))">$INFO[skin.string(Color1)]</value> <value>FF0DEB0D</value><!-- nocolor --> </variable>
Jetzt fragt die Variable ab ob der String leer ist, wenn nicht nimmer er ihn, wenn doch dann den Wert darunter.
wenn nun in deinen Label deine Textcolor mit
$VAR[Testcolor] umsetzt hast es doch schon..Du brauchst überhaupt keine Colors.xml.. kannst sie zwar als Fallback nutzen falls der string leer ist, aber selbst das ist nicht notwendig.
Außer du willst jetzt z.B. zwei Clients genau gleich haben und synchronisierst die Außerhalb von Kodi irgendwie miteinander..So kannst dutzende Farben vorbegen oder einfach ans Ende deiner Liste ein
setzen..Wird kein Wert angegeben in einem String öffnet sich dein keyboard und Kodi fragt danach..
Dort könntest dann auch eine Farbe eintragen die nicht vorgesehen ist.Du könntest sogar den Alphakanal weglassen, die Farbe als HEX dafinieren und in verschiedenen Variablen dann eigene Tranzparenzen aus ein und demselbem String generieren.
oder aber in noch komplexeren Geschichten dann über Variablen Bedingungen definieren - sowas wie wenn BMW blue in String 1 dann verwende black für string 2 usw..
Die Möglichkeiten sind da endlos..Ich hoffe es ist klarer jetzt, ist ne ganz andere herangehendsweise..
Bin aber nicht so der ErklärbärGrüße
-
und wenn ich keine zig buttons möchte?
vor allem, wie kann ich hier wirklich eine custom color definieren?
über buttons oder custom skin sind immer die werte vorgegeben. -
-
Buttons brauchst immer in der Variante..
Es ginge auch mit einem Button direkt in deinen Settings, ganz ohne Auswahldialog als Fake Spincontroll
XML<onclick condition="Stringcompare(Skin.String(Color1),Wert1) | IsEmpty(Skin.String(Color1))">Skin.SetString(Color1,Wert2)</onclick> <onclick condition="Stringcompare(Skin.String(Color1),Wert2)">Skin.SetString(Color1,Wert3)</onclick> <onclick condition="Stringcompare(Skin.String(Color1),Wert3)">Skin.SetString(Color1,Wert4)</onclick> <onclick condition="Stringcompare(Skin.String(Color1),Wert4)">Skin.SetString(Color1,Wert5)</onclick> <onclick condition="Stringcompare(Skin.String(Color1),Wert5)">Skin.SetString(Color1,Wert1)</onclick>
Ein Button der Durchschaltet..
Ist der Wert 1 wird er beim Click 2 ist er 2 wird er 3 usw..
Am Ende wird wieder Wert 1 draus..
Das kannst auch 1000 Stufen weiterführen.Entweder mit Text, und du nutzt den String dann gleich als Label2 in deinen Settings, und setzt dann in deiner VAR
die Texte um in die Farbenoder eben anders rum.. Definierst deine HEX Werte in den strings und fragst alle in einer Variablen ab für ein Label2 wenn eins brauchst.
Dabei fällt aber die Variante der Zusatzfarbe ohne vorgabe weg.
Das geht nicht mit so durchschaltdingern..Ist auch nur ein Vorschlag gewesen..
Scriptet nur weiter ihr zweiGrüße
-
du scheinst mit der xml skin ja echt fit zu sein.
auf jeden fall eine gute idee. danke dafür.
jedoch ne menge tipparbeit.meine idee ist dann halt, ich möchte drei schieberegler, wo man die farbe dann einstellen kann und auch gleich live sieht, was es für ne farbe wird.
und ich will mich da langsam ran tasten.
-
-
tja, das wirst nicht verhindern können in einem Skin.. mit paar hundert Zeilen Code musst da schon rechnen ..
Viele kannst aber wenns einigermasen schlau Benannt wird suchen und ersetzen bei sowas..Wenn so ein Ding mal hast kannst das ja schnell in eine neue Datei kopieren und Color1 mit Color2
ersetzen und schon hast zwei so Dinger..
Natürlich nur wenn dieselben Werte brauchst..Falls es versuchen willst schaust halt wie weit kommst falls euer Script nicht einfacher ist als das.
Grüße
-
<color name="white" menutextcolor="true">FFFFFFFF</color>
ist das der Teil der xml den du gerne neu schreiben willst?
wenn ja könnten wir das z.B mit .replace machen.
also mittels regex das suchen <color name=".*?" menutextcolor="true">.*?</color>
(.*? würde dabei da ohne Klammern überlesen so das der regex passen würde egal welche Farbe oder Wert sich momentan dort befinden würde)
in eine Variable speichern und dann mittels replace austauschen und die xml neu schreiben.Der Code des Scripts muß noch verbessert werden:
Werde das mal heute Abend machen.
Auf Jeden Fall solltest Du die xml auch wieder schließen .
Ist sonst die ganze Zeit im Speicher und irgendwann hast Du eine korrupte Datei.
Ich hatte im letzten Teil meines Addon Tutorial Das File Handling unter Python angesprochen.
Da siehst Du wie man das macht.
Öffne die xml am besten mit with statement dann wird sie automatisch geschlossen.
Den Mode kannst du auslassen da ohne Angabe der default Mode genommen wird und der ist r also read only.
Aus dem einlesen der xml machen wir eine Funktion (so ist sie dann auch in eventuellen anderen Scripts als Baustein einsetzbar)und aus ein paar anderen Sachen auch.
Den regex oder später wenn wir mit replace innerhalb der xml etwas veränderrn sollten.
setzen wir in einer Variable am Anfang des Scriptes so das eventuelle Änderungen nicht innerhalb der Funktion gemacht werden müssen.
usw.Gruß Jan
Kannst mir ja mal einen Download vom kompletten Skin mit deinen Veränderungen geben.
So das ich besser innerhalb des Scriptes testen kann. -
-
hab mich mal im web bissl umgesehen. und folgendes gefunden:
http://www.diveintopython3.net/xml.html
http://lxml.de/tutorial.html
http://luisartola.com/software/2010/easy-xml-in-python/
http://stackoverflow.com/questions/1365…hon-elementtreebevor du dir die finger wund tippst, werde ich damit mal versuchen was auf die reihe zu kriegen.
der hinweis, mit datei schließen, ist ein guter einwand.die skin kann man hier herunterladen. nicht erschrecken, das ist alles noch sehr chaotisch.
ABER ACHTUNG, ist für OSMC aufn Pi (solltest auch die anderen scripte ausprobieren):
https://github.com/harryberlin/BM…rtical-beta.zip -
hab mich mal im web bissl umgesehen. und folgendes gefunden:
Ja , Python 3 mußt Du dich nicht beschäftigen jedenfalls noch nicht für den Einsatz unter Kodi.
Da wir noch auf Python 2.7 bauen.
Minidom wäre auch noch eine Option.
Aber für diese mini xml ist das alles
überdimensioniert
(mehr code ,mehr speicher und nicht schneller)Sieht zwar dann vielleicht aus als ob man mehr Ahnung haben würde.
Aber simple ist besser!!Gruß Jan
-
-
Meinte das so mit den Funktionen .
Mußt Du den Rest von den Gui Sachen noch als Funktion setzen und den path zur xml sowie die xbmc imports.
Schon hast Du einen struktuierten Script.Python
Alles anzeigen#!/usr/bin/env python import re Farben={} result=[] xml='color.xml' r='name="(.*?)" menutextcolor="true">(.*?)</' def getxml(xml): with open(xml) as f: data=f.read() return data def color(xml): data=getxml(xml) for farbe,wert in re.findall(r,data): Farben[farbe] = wert result=Farben.keys() return result Farblist=color(xml) print Farblist
Ergebnis: ['blue', 'BMW M darkblue', 'BMW M blue', 'BMW Amber', 'selected', 'BMW M red', 'white'] -
ok, danke.
warum ich nach anderen xml methoden suche?:
möchte noch komplexere xml auslesen/ändern/speichern.
sehe das ganze hier als einfachen einstieg.
und die zeiten von speicherknappheit sind eigentlich auch vorbei.
und gelernt habe ich auf jeden fall schon einiges. -
-
ok, danke.
warum ich nach anderen xml methoden suche?:
möchte noch komplexere xml auslesen/ändern/speichern.
sehe das ganze hier als einfachen einstieg.
und die zeiten von speicherknappheit sind eigentlich auch vorbei.
und gelernt habe ich auf jeden fall schon einiges.Das ist doch völlig ok!
bei größeren xml Daten bzw. eher bei einer größeren Menge von zu erfassenden Informationen aus der xml wären vielleicht reine xml Parser angebracht.Auch wenn viel Speicher vorhanden ist heißt es doch nicht das man damit ohne Nachdenken umgehen sollte.
Andere haben auch kleinere Systeme und da läuft die Sache dann nicht mehr so gut.
Und Wenn ich viel Laden muß wird ein Addon oder Script langsam.
Bei Bilder kommt noch hinzu das um so größer sie sind um so mehr wird auch auf der Festplatte unter Kodi verbraucht usw. -
welche reine xml parser meinst du denn?
edit:
zum Beispiel?
http://www.tutorialspoint.com/python/python_xml_processing.htm
http://www.python-kurs.eu/python_XML_SAX.php -
-
Bis jetzt habe ich nur Dom und elementree selbst benutzt.
Aber selbst bei dieser kleinen Beispiel.XML aus tutorialpoint würde ich wohl nur mit regex arbeiten.
Da es nach meiner Meinung simpler wäre.
Paredom ist auch ganz nett ist aber kein reiner XML Parser.
Das man selbst etwas an einer XML ändern will kommt finde ich selten vor.
In deiner Color.XML würde ich das über regex und replace machen.
Aber welchen Parser man für seine Zwecke nimmt muss jeder selbst entscheiden.Gruß Jan
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!