Chritian W. Geschrieben 10. Juli 2021 Teilen Geschrieben 10. Juli 2021 Hallo, ich versuche eine Mehrfachauswahlliste zu erstellen, ich bin bisher soweit, dass ich die Liste habe und mit degrückter command Taste mehrere Inputs markieren kann (die Schriftartenliste dient hierbei nur als Beispiel) leider schaffe ich es nur den Text zummanen mit der Listennummer auszugeben und zwar nur für die erste Auswahl. Ich benötige jedoch nur den Text und auch für alle ausgewählten Punkte. Hat jemand eine Idee? Hier noch der Code #CW 2 @Marionette.NodeDefinition class Params(metaclass = Marionette.OrderedClass): #APPEARANCE #Name this = Marionette.Node( "Custom Pulldown" ) this.SetDescription( 'A Dialog with 3 Popups') #Input Ports sDialog = Marionette.PortIn('Dialog Name') sTitle1 = Marionette.PortIn('Title 1:') lPopup1 = Marionette.PortIn([],'choice1') iWidth = Marionette.PortIn(40) #OIP Controls text = Marionette.OIPControl( 'Text', Marionette.WidgetType.Text, '') text.SetDescription( 'Dialog user prompt string' ) #Output Ports sPopup1 = Marionette.PortOut() sPopup1.SetDescription( 'The Result of the Popups' ) #BEHAVIOR this.SetListAbsorb() def RunNode(self): #inputs DialogName = self.Params.sDialog.value[0] title1 = self.Params.sTitle1.value[0] pop1 = self.Params.lPopup1.value width = self.Params.iWidth.value[0] numPopups = 1 EnterDialog = 12255 #script def Dialog_Handler(item, data): self.v1 = vs.GetSelectedChoiceInfo( self.dialog, 11) if item == EnterDialog: for i in range(len(pop1)): vs.AddChoice( self.dialog, 11, pop1, i+1 ) def CreateMyDialog(): self.dialog = vs.CreateLayout( DialogName, 0, 'OK', 'Abbrechen' ) dialog = self.dialog vs.CreateStaticText(dialog, 1, title1, width) vs.CreateListBoxN( dialog, 11, width,10,8) vs.SetFirstLayoutItem( dialog, 1 ) vs.SetBelowItem( dialog, 1, 11, 0, 0 ) vs.SetBelowItem( dialog, 11, 2, 0, 0 ) vs.RunLayoutDialog(dialog, Dialog_Handler ) CreateMyDialog() #outputs self.Params.sPopup1.value = self.v1 Mehrfachauswahl fuer Multidialog.vwx Link zu diesem Kommentar
Dominique Corpataux Geschrieben 10. Juli 2021 Teilen Geschrieben 10. Juli 2021 Hallo Dialogfenster sind ein eigenes Wissensgebiet. Also was in der Funktion/Methode "def Dialog_Handler" stattfindet, sind die Aktionen innerhalb des Dialogfensters. Dort kann man das Dialogfenster dynamisieren. Bzw. je nach Aktion im Dialog z.B. Checkboxen dimmen etc. Ich mache es jeweils so, dass ich in dieser Funktion ein vs.AlrtDialog(str([item,data])) platziere. Dann sehe ich, wenn ich im Dialog eine Aktion tätige, was diese Aktion für Daten ausspuckt und kann entsprechend debuggen. Das nur so mal als generelle Info, wie ich es mir selbst beigebracht habe. Vermutlich gibt es elegantere Varianten. Konkret könnte man dann sehen, dass z.B. vs.AlrtDialog(str(self.v1)) eine Sequenz aus einer Zahl und der Auswahl ausspuckt. Um das zweite Elemente aus dieser Sequenz zu bekommen, benutzt man [1] (Das erste Element wäre [0]). Dann hätte man den Wert für die Letzte Auswahl im Popup. Mit einer Liste. Also z.B. am Anfang eine Liste erzeugen mit z.B. self.KompletteAuswahl = [] und dann in der Funktion Dialog_Handler könnte man die Elemente sammeln mit "self.KompletteAuswahl.append(self.v1[1])" Also jedes angeklickte Element in der Liste würde gesammelt und dann ausgegeben. Im Prinzip könnte man die Auswahl auch mit einem statischen Text im Dialog. Die eigentliche Frage kann ich leider nicht beantworten. Da müsste man in der Script Referenz schauen, wie man die Auswahl mit shift oder cmd bekommt. Meistens kommt man nicht drum rum, die Funktionen durchzutesten und die Resultate z.B. mit "AlrtDialog siehe oben" anzeigen zu lassen. Ins Auge springt mir die Funktion "vs.GetSelectionRange(dialogID, controlID)". Aber ich sehe da schon das Problem, dass vielleicht mit Selection Range nicht das gemeint ist und mit der Ctrl-Auswahl ja keine Range entsteht. Es würde mich spontan auch interessieren, wie hier die Lösung aussieht. Aber das oben genannte mit der "Sammelliste" wäre vielleicht eine Zwischenlösung. Edit. Es sollte so gehen (nicht definitiv ausgetestet): In der Funktion Dialog_Handler ungefähr folgenden Code einbauen. Anzahl Elemente wäre mit vermutlich mit len(pop1) herauszufinden und EnterDialog einfach Testen mit vs.AlrtDialog(str([item,data])) if item == ExitDialog: for i in range(AnzahlElementeDerListe): temp_value = vs.GetSelectedChoiceInfo( self.dialog, 11, i)[1] if value != '' self.KompletteAuswahl.append(temp_value) Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090 Link zu diesem Kommentar
Chritian W. Geschrieben 12. Juli 2021 Autor Teilen Geschrieben 12. Juli 2021 Am 10.7.2021 um 21:31 schrieb Dominique Corpataux: Edit. Es sollte so gehen (nicht definitiv ausgetestet): Also ich bekomme das nicht erfolgreich eingebaut. Mit der [1] hinter self.v1 = vs.GetSelectedChoiceInfo( self.dialog, 11) bekomme ich jetzt zwar nur den Namen und nicht auch noch die Listennummer (wie gewünscht) aber ich bekomme meine Liste noch nicht. Mit vs.AlrtDialog(str([item,data])) sehe ich auch, dass nacheinander die Auswahl aufgerufen wird, aber sobald ich die Zusätzlichen Codezeilen versuche einzubauen bringt er mir eine Fehlermeldung spätestens bei if value != '' Und dann hilft mir auch vs.Alert nicht weiter. Wenn es noch weitere Ideen gibt - gerne hier posten - ich probiere weiter. Kann man vielleicht hieraus https://www.python-lernen.de/tkinter-listbox.htm etwas ableiten?? Link zu diesem Kommentar
Dominique Corpataux Geschrieben 13. Juli 2021 Teilen Geschrieben 13. Juli 2021 Hallo Zurzeit leider keinen Zugriff auf VW. Am 12.7.2021 um 07:37 schrieb Chritian W.: Also ich bekomme das nicht erfolgreich eingebaut. Ich denke, dass es dann laufen würde. Das verlinkte Beispiel macht was ähnliches und da kann man schon was ableiten aber man müsste es auch zuerst eingebaut bekommen. Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090 Link zu diesem Kommentar
Chritian W. Geschrieben 14. Juli 2021 Autor Teilen Geschrieben 14. Juli 2021 vor 15 Stunden schrieb Dominique Corpataux: Ich denke, dass es dann laufen würde. Also ich habe dass jetzt so eingebaut: … numPopups = 1 EnterDialog = 12255 self.KompletteAuswahl = [] #script def Dialog_Handler(item, data): self.v1 = vs.GetSelectedChoiceInfo( self.dialog, 11)[1] if item == EnterDialog: for i in range(len(pop1)): vs.AddChoice( self.dialog, 11, pop1, i+1 ) if item == ExitDialog: for i in range(AnzahlElementeDerListe): temp_value = vs.GetSelectedChoiceInfo(self.dialog, 11)[1] if value != '' self.KompletteAuswahl.append(temp_value) vs.AlrtDialog(str([item,data])) def CreateMyDialog(): … Vielleicht habe ich jetzt einfach zu viel drin oder irgendwelche Variablen stimmen noch nicht. Link zu diesem Kommentar
Dominique Corpataux Geschrieben 14. Juli 2021 Teilen Geschrieben 14. Juli 2021 line 49 fehlt der Doppelpunkt. Dann fehlt noch ExitDialog (das ließe sich mit AlrtDialog herausfinden) und AnzahlElemente welche len(pop1) sein wird. ChoiceInfo muss dann noch den Startwert i Enthalten siehe oben. Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090 Link zu diesem Kommentar
Chritian W. Geschrieben 14. Juli 2021 Autor Teilen Geschrieben 14. Juli 2021 (bearbeitet) vor 4 Stunden schrieb Dominique Corpataux: ExitDialog (das ließe sich mit AlrtDialog herausfinden) Habe es jetzt noch mal so versucht. Jetzt bekomme ich zwar keine Fehlermeldung mehr aber trotzdem keine Listenausgabe. ArltDialog bringt nacheinander die in den Bildern abgebildeten Meldungen. … #inputs DialogName = self.Params.sDialog.value[0] title1 = self.Params.sTitle1.value[0] pop1 = self.Params.lPopup1.value width = self.Params.iWidth.value[0] numPopups = 1 EnterDialog = 12255 self.KompletteAuswahl = [] AnzahlElemente = (len(pop1)) ExitDialog = [12256] #script def Dialog_Handler(item, data): self.v1 = vs.GetSelectedChoiceInfo( self.dialog, 11)[1] if item == EnterDialog: for i in range(len(pop1)): vs.AddChoice( self.dialog, 11, pop1, i+1 ) if item == ExitDialog: for i in range(AnzahlElemente): temp_value = vs.GetSelectedChoiceInfo(self.dialog, 11,i)[1] if value != '': self.KompletteAuswahl.append(temp_value) vs.AlrtDialog(str([item,data])) def CreateMyDialog(): … Bearbeitet 14. Juli 2021 von Chritian W. Link zu diesem Kommentar
Dominique Corpataux Geschrieben 18. Juli 2021 Teilen Geschrieben 18. Juli 2021 def RunNode(self): from collections import OrderedDict #inputs DialogName = self.Params.sDialog.value[0] title1 = self.Params.sTitle1.value[0] pop1 = self.Params.lPopup1.value width = self.Params.iWidth.value[0] numPopups = 1 EnterDialog = 12255 OKDialog = 12256 self.KompletteAuswahl = [] #script def Dialog_Handler(item, data): if item == EnterDialog: for i in range(len(pop1)): vs.AddChoice( self.dialog, 11, pop1[i], i+1 ) if item == OKDialog: for i in range(len(pop1)): temp_value = vs.GetSelectedChoiceInfo( self.dialog, 11, i) if temp_value[1] != '': self.KompletteAuswahl.append(temp_value[1]) def CreateMyDialog(): self.dialog = vs.CreateLayout( DialogName, 0, 'OK', 'Abbrechen' ) dialog = self.dialog vs.CreateStaticText(dialog, 1, title1, width) vs.CreateListBoxN( dialog, 11, width,10,8) vs.SetFirstLayoutItem( dialog, 1 ) vs.SetBelowItem( dialog, 1, 11, 0, 0 ) vs.SetBelowItem( dialog, 11, 2, 0, 0 ) vs.RunLayoutDialog(dialog, Dialog_Handler ) CreateMyDialog() #outputs ListWithoutDups = list(OrderedDict.fromkeys(self.KompletteAuswahl)) self.Params.sPopup1.value = ListWithoutDups 2 Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090 Link zu diesem Kommentar
Chritian W. Geschrieben 12. September 2021 Autor Teilen Geschrieben 12. September 2021 Ich habe ein weiteres Problem, ich habe leider erst jetzt festgestellt, dass bei sämtlichen Custom Pulldown Menüs der Abbrechen Button nicht korrekt funktioniert. Er hat quasi die selbe Funktion wie OK. Was für Codezeilen müssen integriert werden, damit beim, drücken auf Abbrechen nichts ausgegeben wird? Link zu diesem Kommentar
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden