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 kkpimport SegmentConfig as SCimport oleimport xml.etree.ElementTree as ETimport syssys.path.append(kkp.Get_Systemgeberdir() + „/ui“)XML_PARAM = „“““““def fillCombobox(sc):#TODOpassdef createXML():try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)fillCombobox(sc)sXml = sc.toXml()return sXmlif __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 kkpimport SegmentConfig as SCdef comboBoxAuslesen(sc):#TODOpassif __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 kkpimport SegmentConfig as SCdef comboBoxAuslesen(sc):node = sc.findByName(„cmbBox“)wert = node.m_sValuekkp.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 kkpimport SegmentConfig as SCimport oleimport xml.etree.ElementTree as ETimport syssys.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 = 0sc = SC.SegmentConfig(iObjNr)fillCombobox(sc)sXml = sc.toXml()return sXmlif __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 kkpimport SegmentConfig as SCdef comboBoxAuslesen(sc):node = sc.findByName(„cmbBox“)kennziffer = node.m_sValuekkp.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 kkpimport SegmentConfig as SCdef comboBoxAuslesen(sc):node = sc.findByName(„cmbBox“)kennziffer = node.m_sValueif 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 kkpimport SegmentConfig as SCimport oleimport xml.etree.ElementTree as ETimport syssys.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 suchenselected = „“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 = kennziffersc.initComboBox(„cmbBox“ , selected , daten)def createXML():try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)fillCombobox(sc)sXml = sc.toXml()return sXmlif __name__ == ‚__main__‘:sXml = createXML()print(sXml)