Farbliste erstellen

Im Tutorial über den SQL Zugriff habe ich dir bereits gezeigt, wie du Farben aus der Datenbank auslesen kannst SQL Zugriff auf Systemdatenbank.

In diesem Tutorial werde ich das Wissen nutzen, um dazu eine Auswahl in die UI-Maske zu setzen. Dazu fange ich mit dem letzten Skript aus dem SQL Tutorial an.

# -*- coding: utf-8 -*-
import kkp
import kkp_gemeinsame
import ole
import xml.etree.ElementTree as ET
def query(sQuery):
    erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , sQuery)
    if len(erg) > 0: xml = ET.fromstring(erg[1])
    else: xml = None
    return xml
def FarbenAuflisten():
    xml = query(„Select ID, Sortierung, Farbnr, Name1, Name2, Rot, Gruen, Blau from Farben“)
    for xmlRecord in xml.findall(‚record‘):
        id = xmlRecord.get(‚ID‘)
        sortierung = xmlRecord.get(‚Sortierung‘)
        farbnr = xmlRecord.get(‚Farbnr‘)
        name1 = xmlRecord.get(‚Name1‘)
        name2 = xmlRecord.get(‚Name2‘)
        r = xmlRecord.get(‚Rot‘)
        g = xmlRecord.get(‚Gruen‘)
        b = xmlRecord.get(‚Blau‘)
        print(id + „, “ + sortierung + „, “ + farbnr + „, “ + name1 + „, “ + name2 + „, “ + r + „, “ + g + „, “ + b)
if __name__ == ‚__main__‘:
    FarbenAuflisten()

Dazu müssen wir nun eine UI erstellen und dort ein Tree-Widget einsetzen.

Dieses Tree-Widget müssen wir noch ein bisschen einstellen. So werde ich dem Widget sagen, dass es 2 Spalten verwenden soll. In der 1. Spalte soll dann der RGB Wert angezeigt werden und in der 2. Spalte der Farbname. Ferner gebe ich meinem Tree-Widget den Namen „treeColor“ damit ich erkenne, worum es geht.

Nachdem das erledigt ist, können wir auch schon an die Programmierung gehen. Das Tutorial-Skript, auf dem ich aufbaue, ist nicht für UI Masken geeignet, also muss ich da ein paar Zeilen ergänzen und anpassen.

# -*- coding: utf-8 -*-
import kkp
import kkp_gemeinsame
import ole
import xml.etree.ElementTree as ET
#  Hinzu
import SegmentConfig asSC
XML_PARAM = „“““““
#Ende Hinzu
def query(sQuery):
    erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , sQuery)
    if len(erg) > 0: xml = ET.fromstring(erg[1])
    else: xml = None
    return xml
def FarbenAuflisten():
    xml = query(„Select ID, Sortierung, Farbnr, Name1, Name2, Rot, Gruen, Blau from Farben“)
    for xmlRecord in xml.findall(‚record‘):
        id = xmlRecord.get(‚ID‘)
        sortierung = xmlRecord.get(‚Sortierung‘)
        farbnr = xmlRecord.get(‚Farbnr‘)
        name1 = xmlRecord.get(‚Name1‘)
        name2 = xmlRecord.get(‚Name2‘)
        r = xmlRecord.get(‚Rot‘)
        g = xmlRecord.get(‚Gruen‘)
        b = xmlRecord.get(‚Blau‘)
        print(id + „, “ + sortierung + „, “ + farbnr + „, “ + name1 + „, “ + name2 + „, “ + r + „, “ + g + „, “ + b)
#Hinzu
def createXML():
    iObjNr = 0
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
if __name__ == ‚__main__‘:
    #Angepasst
    sXml = createXML()
    print(sXml)

Nun werde ich mal so anfangen, dass wir zuerst das Tree-Widget mit „Daten“ füttern und danach werden die Daten dafür passend erstellen.

Also bauen wir uns eine Funktion zum Initialisieren des Tree Widgets.

# -*- coding: utf-8 -*-
import kkp
import kkp_gemeinsame
import ole
import xml.etree.ElementTree as ET
import SegmentConfig asSC
XML_PARAM = „“““““
def query(sQuery):
    erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , sQuery)
    if len(erg) > 0: xml = ET.fromstring(erg[1])
    else: xml = None
    return xml
def FarbenAuflisten():
    xml = query(„Select ID, Sortierung, Farbnr, Name1, Name2, Rot, Gruen, Blau from Farben“)
    for xmlRecord in xml.findall(‚record‘):
        id = xmlRecord.get(‚ID‘)
        sortierung = xmlRecord.get(‚Sortierung‘)
        farbnr = xmlRecord.get(‚Farbnr‘)
        name1 = xmlRecord.get(‚Name1‘)
        name2 = xmlRecord.get(‚Name2‘)
        r = xmlRecord.get(‚Rot‘)
        g = xmlRecord.get(‚Gruen‘)
        b = xmlRecord.get(‚Blau‘)
        print(id + „, “ + sortierung + „, “ + farbnr + „, “ + name1 + „, “ + name2 + „, “ + r + „, “ + g + „, “ + b)
#Hinzu
def initColorTree(sc):
    currentData = „“
    listNodes = []
    sc.initTree(„treeColor“ , currentData , listNodes)
def createXML():
    iObjNr = 0
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
    #Hinzu
    initColorTree(sc)
    sXml = sc.toXml()
    return sXml
if __name__ == ‚__main__‘:
    sXml = createXML()
    print(sXml)

Um ein Tree Widget zu initialisieren brauchen wir eine Liste Knoten vom Typ QTreeWidgetItem und einen String mit einem Wert, was aktuell ausgewählt ist. Das erklärt sich, wenn wir die Liste mit Knoten aufbauen.

def initColorTree(sc):
    nodeC = sc.Node(„QTreeWidgetItem“)
    nodeC.m_sText = „Text Spalte 1 ; Text Spalte 2“
    nodeC.m_sValue = „ID 1“
    nodeC.m_sBackgroundColor = „222;111;000“
    currentData = „“
    listNodes = []
    listNodes.append(nodeC)
    sc.initTree(„treeColor“ , currentData , listNodes)

Und schon haben wir eine Farbe dargestellt. Das Attribut „m_sValue“ kann frei bestimmt werden und dient zur eindeutigen Identifizierung. So können wir bei currentData nämlich dann einen Wert wählen, der bei den vielen Farben das Attribut „m_sValue“ hat. Es eignet sich beispielsweise die ID einer Farbe zu verwenden, da man diese so auch später noch in der Daten suchen kann.

Bisher ist das doch alles noch ein reines Kinderspiel oder? Und bleibt so einfach. Wir haben ja bereits eine Funktion mit der wir die Farben aus der Datenbank auflisten können. Jetzt müssen wir ja eigentlich nur aus der Liste von Farben eine Liste von Knoten machen. Also machen wir das eben.

ACHTUNG! Es hat sich inzwischen eine Änderung im KKP ergeben. Der Query eines SQL Befehls muss nun in ein Array hinein.

def query(sQuery):
    #erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , sQuery) # <- Bisher
    erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , [sQuery]) #“ACHTUNG!“
    if len(erg) > 0: xml = ET.fromstring(erg[1])
    else: xml = None
    return xml
def FarbenAuflisten(sc):
    liste = []
    xml = query(„Select ID, Sortierung, Farbnr, Name1, Name2, Rot, Gruen, Blau from Farben“)
    for xmlRecord in xml.findall(‚record‘):
        id = xmlRecord.get(‚ID‘)
        sortierung = xmlRecord.get(‚Sortierung‘)
        farbnr = xmlRecord.get(‚Farbnr‘)
        name1 = xmlRecord.get(‚Name1‘)
        name2 = xmlRecord.get(‚Name2‘)
        r = xmlRecord.get(‚Rot‘)
        g = xmlRecord.get(‚Gruen‘)
        b = xmlRecord.get(‚Blau‘)
        nodeColor = sc.Node(„QTreeWidgetItem“)
        nodeColor.m_sText = „;“ + name2 + “ – “ + name1 #ACHTUNG
        nodeColor.m_sValue = str(id)
        nodeColor.m_sBackgroundColor = r + „;“ + g + „;“ + b
        liste.append(nodeColor)
    return liste

Ich habe Name2 vor Name1 gestellt, weil in Name2 der Ral Code steht, wohingehen in Name1 der Rufname der Farbe zu finden ist. Die Werte werden bei QTreeWidgetItems pro Spalte mit einem Semikolon getrennt. Daher habe ich am Anfang der Zeile ein Semikolon gesetzt, damit die Farbbezeichnung ist die 2. Spalte kommt.

nodeColor.m_sText = „;“ + name2 + “ – “ + name1 #ACHTUNG

Das Ergebnis sieht dann so aus:

Schick, oder?

Wenn ich nun einen Wert vorauswählen will muss ich nur den eine ID angeben, denn diese sind ja im Attribut „m_sValue“ verwendet worden.

def initColorTree(sc):
    currentData = „567“ #ACHTUNG
    listNodes = FarbenAuflisten(sc)
    sc.initTree(„treeColor“ , currentData , listNodes)

In dem Fall springt dann die Auswahl auch schon direkt zur gewählten Farbe.

Im Out-Skript könnte man die gewählte Farbe dann zum Beispiel im Warenkorb als Option abspeichern und hier im In-Skript wieder auslesen. Wie das geht ist den vorherigen Tutorials bereits beschrieben, also probiere es einfach mal aus.

Hier noch einmal das gesamte Skript.

# -*- coding: utf-8 -*-
import kkp
import kkp_gemeinsame
import ole
import xml.etree.ElementTree as ET
import SegmentConfig asSC
XML_PARAM = „“““““
def query(sQuery):
    erg = kkp.OLE_CMD(ole.OLE_QUERY_SYSTEMGEBER_DATENBANK , [sQuery])
    if len(erg) > 0: xml = ET.fromstring(erg[1])
    else: xml = None
    return xml
def FarbenAuflisten(sc):
    liste = []
    xml = query(„Select ID, Sortierung, Farbnr, Name1, Name2, Rot, Gruen, Blau from Farben“)
    for xmlRecord in xml.findall(‚record‘):
        id = xmlRecord.get(‚ID‘)
        sortierung = xmlRecord.get(‚Sortierung‘)
        farbnr = xmlRecord.get(‚Farbnr‘)
        name1 = xmlRecord.get(‚Name1‘)
        name2 = xmlRecord.get(‚Name2‘)
        r = xmlRecord.get(‚Rot‘)
        g = xmlRecord.get(‚Gruen‘)
        b = xmlRecord.get(‚Blau‘)
        nodeColor = sc.Node(„QTreeWidgetItem“)
        nodeColor.m_sText = „;“ + name2 + “ – “ + name1
        nodeColor.m_sValue = str(id)
        nodeColor.m_sBackgroundColor = r + „;“ + g + „;“ + b
        liste.append(nodeColor)
    return liste
def initColorTree(sc):
    currentData = „567“ #ACHTUNG
    listNodes = FarbenAuflisten(sc)
    sc.initTree(„treeColor“ , currentData , listNodes)
def createXML():
    iObjNr = 0
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
    initColorTree(sc)
    sXml = sc.toXml()
    return sXml
if __name__ == ‚__main__‘:
    sXml = createXML()
    print(sXml)