Comboboxen

Eine beliebte Methode in den UI Masken Einstellungen vorzunehmen und anzuzeigen sind Comboboxen.

In diesem Tutorial zeige ich dir wie du Comboboxen in die UI zeichnest, diese mit Daten füllst und anschließend die getätigten Einstellungen ausliest.

Zuerst zeichnen wir uns eine ComboxBox in die UI ein. Ich habe auch gleich ein Label und ein paar Layouts eingesetzt, einfach, damit die Combobox nicht so alleine da steht.

Und mehr ist im Bereich UI auch gar nicht zu erledigen. Kommen wir also direkt zum In-Skript und legen, wie immer ein Grundgerüst an. Natürlich kannst Du die Inhalte aus diesem Tutorial auch in dein bereits existierendes Skript einbauen.

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
import ole
import xml.etree.ElementTree as ET
import sys
sys.path.append(kkp.Get_Systemgeberdir() + „/ui“)
XML_PARAM = „“““““
def fillCombobox(sc):
    #TODO
    pass
def createXML():
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
    fillCombobox(sc)
    sXml = sc.toXml()
    return sXml
if __name__ == ‚__main__‘:
    sXml = createXML()
    print(sXml)

Um eine Combobox zu befüllen braucht man eine Liste mit Daten. Jeder Datensatz besteht aus 2 Feldern, der angezeigte Text und die Daten, die sich hinter dem angezeigtem Text verbergen.

def fillCombobox(sc):
    daten = [
        („Text 1“ , „Daten 1“),
        („Text 2“ , „Daten 2“),
        („Text 3“ , „Daten 3“)
    ]

Was wir als Daten mitgeben, bleibt uns überlassen, solange es einen String darstellt. Entsprechend lohnt es sich, sich genau zu überlegen, was man als Daten mitgibt, denn, wenn wir später die Einstellungen der Combobox abfragen, bekommen wir genau die Daten, die hinter dem ausgewählten Text stehen. Wenn also der Benutzer „Text 2“ wählt, bekommen wir in der Out Maske „Daten 2“ als Ergebnis.

Bei Comboboxen können wir ganz einfach ein Element bestimmen, welches vorausgewählt sein soll. Dazu müssen wir die Daten übergeben, nach denen gesucht werden soll. Das erklärt sich am Beispiel leichter. Ich erstelle mir also eine Variable, die ich „selected“. Zunächst lasse ich die einfach mal leer, damit man die Unterschiede besser erkennen kann.

def fillCombobox(sc):
    daten = [
        („Text 1“ , „Daten 1“),
        („Text 2“ , „Daten 2“),
        („Text 3“ , „Daten 3“)
    ]
    selected = „“
    sc.initComboBox(„cmbBox“ , selected , daten)

Wenn wir das Skript ausführen, bekommen wir eine Maske mit einer zunächst scheinbar leeren Combobox (es ist ja nichts ausgewählt). Klicken wir auf die Combobox, bekommen wir die Auswahlmöglichkeiten angezeigt.

Nun vergebe ich für selected einfach mal den Wert „Daten 3“.

def fillCombobox(sc):
    daten = [
        („Text 1“ , „Daten 1“),
        („Text 2“ , „Daten 2“),
        („Text 3“ , „Daten 3“)
    ]
    selected = „Daten 3“
    sc.initComboBox(„cmbBox“ , selected , daten)

Wenn wir jetzt die Maske öffnen ist der Eintrag „Text 3“ vorausgewählt.

Und so einfach kann man Comboboxen mit Inhalt füllen. Also können wir uns direkt um das Out-Skript kümmern und die getätigte Einstellung auslesen.

Fangen wir wieder mit einem Grundgerüst an.

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
def comboBoxAuslesen(sc):
    #TODO
    pass
if __name__ == ‚__main__‘:
    sc = SC.SegmentConfig()
    sc.fromfile(kkp.Get_Projektdir() + „\\segmentConfig_ui.xml“)

Und schon können wir loslegen und die Combobox abfragen. Das ist so einfach, hier ist direkt das komplette Skript:

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
def comboBoxAuslesen(sc):
    node = sc.findByName(„cmbBox“)
    wert = node.m_sValue
    kkp.MsgBox(wert)
if __name__ == ‚__main__‘:
    sc = SC.SegmentConfig()
    sc.fromfile(kkp.Get_Projektdir() + „\\segmentConfig_ui.xml“)
    comboBoxAuslesen(sc)

In wert steht der Wert drin, den der Anwender in der Maske insgeheim ausgewählt halt, als er einen Anzeigetext gewählt hat.

 

 

Wenn wir das jetzt geschickt anstellen, könnten wir als Daten zum Beispiel eine Profilkennziffer nehmen, die wir einstellen wollen.

Gehen wir also noch einmal ins In-Skript. Hier wähle ich nun als Daten die verfügbaren Innensparren in meinem System. Die Vorbelegung lasse ich zunächst einmal weg.

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
import ole
import xml.etree.ElementTree as ET
import sys
sys.path.append(kkp.Get_Systemgeberdir() + „/ui“)
XML_PARAM = „“““““
def fillCombobox(sc):
    daten = [
        („Sparren 105 mm“ , „900.001.010.100.030.0010“),
        („Sparren 80 mm“ , „900.001.010.100.030.0012“),
        („Sparren 135 mm“ , „900.001.010.100.030.0015“)
    ]
    selected = „“
    sc.initComboBox(„cmbBox“ , selected , daten)
def createXML():
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
    fillCombobox(sc)
    sXml = sc.toXml()
    return sXml
if __name__ == ‚__main__‘:
    sXml = createXML()
    print(sXml)

Und im Out-Skript nehme ich dann den Wert und stelle damit einfach das gewählte Profil ein.

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
def comboBoxAuslesen(sc):
    node = sc.findByName(„cmbBox“)
    kennziffer = node.m_sValue
    kkp.Profile_tauschen(kennziffer)
if __name__ == ‚__main__‘:
    sc = SC.SegmentConfig()
    sc.fromfile(kkp.Get_Projektdir() + „\\segmentConfig_ui.xml“)
    comboBoxAuslesen(sc)

Und das ist auch schon das gesamte Skript und nun kann ich noch mehr machen. Ich könnte ja sagen, wenn ein bestimmter Sparren eingestellt ist, dann sollen auch andere Profile direkt passend dazu eingestellt werden.

Gehen wir also noch einmal ins Out Skript.

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
def comboBoxAuslesen(sc):
    node = sc.findByName(„cmbBox“)
    kennziffer = node.m_sValue
    if kennziffer == „900.001.010.100.030.0010“:
        kkp.Profile_tauschen(„900.001.010.100.030.0010“)
        kkp.Profile_tauschen(„900.001.010.101.060.0010“)
        kkp.Profile_tauschen(„900.001.010.101.010.0010“)
    if kennziffer == „900.001.010.100.030.0012“:
        kkp.Profile_tauschen(„900.001.010.100.030.0012“)
        kkp.Profile_tauschen(„900.001.010.101.060.0010“)
        kkp.Profile_tauschen(„900.001.010.101.010.0012“)
    if kennziffer == „900.001.010.100.030.0015“:
        kkp.Profile_tauschen(„900.001.010.100.030.0012“)
        kkp.Profile_tauschen(„900.001.010.101.060.0012“)
        kkp.Profile_tauschen(„900.001.010.101.010.0012“)
if __name__ == ‚__main__‘:
    sc = SC.SegmentConfig()
    sc.fromfile(kkp.Get_Projektdir() + „\\segmentConfig_ui.xml“)
    comboBoxAuslesen(sc)

Jetzt haben wir für jede der 3 Auswahlmöglichkeiten gleich eine ganze Reihe an Profilen eingestellt. Entsprechend können wir im In-Skript nun die Bezeichnungen anpassen.

Fehlt noch die Vorauswahl. Aber da wir ja ganz geschickt eine Profilkennziffer zur Identifikation genommen haben, können wir einfach in der Zeichnung nachfragen, welcher Mittelsparren gerade eingestellt ist. Und den Wert nehmen wir dann als Voreinstellung.

Hier das komplette In-Skript:

# -*- coding: utf-8 -*-
import kkp
import SegmentConfig as SC
import ole
import xml.etree.ElementTree as ET
import sys
sys.path.append(kkp.Get_Systemgeberdir() + „/ui“)
XML_PARAM = „“““““
def fillCombobox(sc):
    daten = [
        („Standart-Ausführung“ , „900.001.010.100.030.0010“),
        („Light-And-Easy“ , „900.001.010.100.030.0012“),
        („Starke Ausführung“ , „900.001.010.100.030.0015“)
    ]
    #Voreinstellung suchen
    selected = „“
    objListe = kkp.Objektliste_Erstellen(„900.001.010.100.030“)
    if len(objListe) > 0:
        objNr = objListe[0]
        info = kkp.Get_Objekt_Info(objNr)
        kennziffer = info[2]
        selected = kennziffer
    sc.initComboBox(„cmbBox“ , selected , daten)
def createXML():
    try: iObjNr = int(XML_PARAM)
    except: iObjNr = 0
    sc = SC.SegmentConfig(iObjNr)
    fillCombobox(sc)
    sXml = sc.toXml()
    return sXml
if __name__ == ‚__main__‘:
    sXml = createXML()
    print(sXml)