Zum Inhalt springen

Marionette Popup mit Mehrfachauswahl


Chritian W.

Frage

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

8 Antworten auf diese Frage

Empfohlene Beiträge

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
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

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
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.

63803C2E-3925-4321-8831-8DD4600D089C.jpeg

Link zu diesem Kommentar
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():

4260DCF1-321F-4A4A-A2C5-9C2124A84D4A.jpeg

0986F570-C6E5-4EFB-B270-707A3F5AB12D.jpeg

3F582EE6-1863-4E28-9CA0-06B524CDF7FE.jpeg

3C414CD1-B44B-44DB-A58B-CD9EF2579103.jpeg

1C002CD1-9B93-44F0-B233-22E7E3AEBDDD.jpeg

D8C62790-6634-43B2-A4C9-A15DA5952FA9.jpeg

Bearbeitet von Chritian W.
Link zu diesem Kommentar
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

 

  • Like 2

Macbook m3 Max 48 GB | Ryzen 3950x 64GB NVIDIA rtx3090

Link zu diesem Kommentar

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
  • Forenstatistik

    • Themen insgesamt
      24,3Tsd
    • Beiträge insgesamt
      125,5Tsd
×
×
  • Neu erstellen...