Die UI Masken besitzen sogar eine Signalsteuerung. Signale sind dazu da, um auf eine Änderung in der Maske direkt zu reagieren. Dafür sind aktuell folgende Signale programmiert worden.
„clicked“ , „clicked2“ und „valueChanged“
- „clicked2“ ist ein Signal, das ausgeführt wird, wenn auf ein Objekt geklickt wurde.
- „valueChanged“ wird ausgeführt, wenn der Zahlenwert einer (Double-)Spin-Box verändert wurde.
- „clicked“ ist ein Signal mit ein Python Skript ausgeführt werden kann.
- „editingFinished“ ist ein Signal wenn ein Textfeld bearbeitet wurde
- „textEdited“ ist ein Signal wenn ein Textfeld bearbeitet wurde (durch den Benutzer direkt)
Wenn ein Signal ausgelöst wird, kann man angeben, was sich sich in dem Fall in der Maske ändern soll. Leider ist die Programmierung dessen recht unübersichtlich, weshalb ich empfehle, das nicht zu weit auszureizen.
Aber schauen wir uns das doch einfach mal an einem Beispiel an.
Zuerst habe ich mir eine UI Maske gebastelt, um die beiden Signale zu demonstrieren. Diese sieht wie folgt aus:
Dann erstelle ich mir ein einfaches In Skript, in das ich dann im 2. Schritt die Signale einbauen kann.
# -*- coding: utf-8 -*-import kkpimport SegmentConfig as SCXML_PARAM = „“““““def createXML():iObjNr = 0try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)sXml = sc.toXml()return sXmlif __name__ == ‚__main__‘:sXml = createXML()print(sXml)
In dieses Skript verbinde ich nun den ersten Radio-Shalter mit dem clicked2 Signal.
# -*- coding: utf-8 -*-import kkpimport SegmentConfig as SCXML_PARAM = „“““““def createXML():iObjNr = 0try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)sc.setSignal(„radio1“ , „clicked2“ , „setProperty(btn1 , visible , false)“) #AchtungsXml = sc.toXml()return sXmlif __name__ == ‚__main__‘:sXml = createXML()print(sXml)
Der Befehl setSignal bekommt 3 Parameter. Einmal den Objektnamen des Objektes, auf das die Maske reagieren soll. In diesem Fall soll die Maske also darauf „horchen“ ob etwas mit „radio1“ passiert. Im 2. Parameter wird dann angeben was mit „radio1“ passieren muss, damit der Befehl im 3. Parameter ausgeführt wird.
Also in unserem Beispiel: „Wenn radio geklickt wurde, dann führe aus: setProperty…“
Bei den Signalen clicked2 und valueChanged können diverse Funktionen ausgeführt werden. Es kann sein, dass diese Liste mit der Zeit erweitert wird. Aktuell sind 3 Funktionen möglich.
- „UpdateConstruction“ – Berechnet die 3D Konstruktion neu
- „summe“ – Berechnet die Summe aus einer Liste von Feldern und gibt das Ergebnis in ein Feld ein
- „setProperty“ – ändert eine Eigenschaft eines Objekts.
Bei allen Funktion die Groß- Kleinschreibung egal.
Bei dem Signal „clicked“ muss man als Parameter den Dateinamen eines Python Skripts angeben, welches dann ausgeführt werden soll.
In unserem Beispiel verwenden wir die recht einfache Funktion „setProperty“. Mit dieser Funktion schalten wir den Knopf „btn1“ auf unsichtbar.
Das können wir nun auch umkehren, indem wir auf den anderen Radio-Schalter ein Signal legen, mit dem wir den Knopf wieder sichtbar machen können.
sc.setSignal(„radio1“ , „clicked2“ , „setProperty(btn1 , visible , false)“)sc.setSignal(„radio2“ , „clicked2“ , „setProperty(btn1 , visible , true)“)
Wenn wir dann auf den ersten Radio-Shalter klicken wird der Knopf also unsichtbar und wenn wir auf den zweiten Radio-Schalter klicken wird der Knopf wieder sichtbar.
Nun wollen wir uns einmal das „textEdited“ Signal anschauen, und das legen wir uns auf das Textfeld. Damit verändern wir den Text von „label1“
def createXML():iObjNr = 0try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)sc.setSignal(„radio1“ , „clicked2“ , „setProperty(btn1 , visible , false)“)sc.setSignal(„radio2“ , „clicked2“ , „setProperty(btn1 , visible , true)“)sc.setSignal(„text1“ , „textEdited“ , „setProperty(label1 , text , Der Text wurde geaendert)“) #AchtungsXml = sc.toXml()return sXml
Sobald wir dann im Textfeld „text1“ etwas tippen wird das Label geändert. Auf diese Weise kann man da schon einiges machen. Teile der Maske deaktivieren, aktivieren, unsichtbar schalten, Werte anlalog zur Eingabe anpassen, die Konstruktion direkt einstellen, und vieles mehr…
Man kann auch mehrere Funktion direkt ausführen. Aber hier wird es dann schnell unübersichtlich, denn leider müssen alle Funktionen in dieselbe Zeile geschrieben werden. Ein Zeilenumbruch ist an der Stelle nicht zulässig. Einzelne Funktionen werden mittels Semikolon voneinander getrennt.
# -*- coding: utf-8 -*-
import kkpimport SegmentConfig as SCXML_PARAM = „“““““def createXML():iObjNr = 0try: iObjNr = int(XML_PARAM)except: iObjNr = 0sc = SC.SegmentConfig(iObjNr)sc.setSignal(„radio1“ , „clicked2“ , „setProperty(btn1 , visible , false)“)sc.setSignal(„radio2“ , „clicked2“ , „setProperty(btn1 , visible , true)“)sc.setSignal(„text1“ , „textEdited“ , „setProperty(label1 , text , Der Text wurde geaendert);setProperty(btn1 , text , klick mich)“) #Achtungsc.setSignal(„btn1“ , „clicked2“ , „setProperty(btn1 , text , ich wurde geklickt)“)sXml = sc.toXml()return sXmlif __name__ == ‚__main__‘:sXml = createXML()print(sXml)