Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?[Version: JMP Pro 16.2.0]
Hallo,
Ich versuche, ein Schnittstellenfenster für ein Skript zu erstellen, das:
- sendet die aktuelle Datentabelle an Python und ruft Benutzereingabewerte für die Parameter ab,
- führt einige Aktionen in Python aus,
- Fügt einige Spalten aus einem Python-DataFrame zur aktuellen Datentabelle hinzu.
Ich habe als Anhang das Layout hinzugefügt, das ich für die Benutzeroberfläche im Sinn habe.
Ich habe noch nicht herausgefunden, wie ich den Inhalt der Parameter aktualisieren kann, zu deren Eingabe ich den Benutzer auffordere es hängt davon ab die vom Benutzer ausgewählte Option in der ComboBox oben.
Um die Wartung des Codes zu vereinfachen und Coderedundanz zu vermeiden (wichtig für mich, da ich viele Optionen in der ComboBox haben möchte), möchte ich die Parameter und ihre Standardwerte in einem assoziativen Array über dem Skript speichern. Die Anzahl der Parameter für jede Option kann unterschiedlich sein.
Ich habe mir den Code dieses Add-Ins angesehen ( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 ), aber leider sind die anzuzeigenden Felder und die zugehörigen Werte für die Nummernbearbeitungsfelder fest codiert.
Vielen Dank für Ihre Hilfe.
Mit freundlichen Grüßen,
François
#Emmanuel_Romeu
#James_Bark
AA =
Associative Array(
{
{"Choice_A",
[
"param_1" => 2,
"param 2" => 15,
"param_4" => .
]
},
{"Choice_B",
[
"param 1" => 2,
"param 3" => 10,
"param 4" => .
]
},
{"Choice_C",
[
"param 1" => 3,
"param 4" => .,
"param 6" => 23,
"param 7" => 123
]
}
}
);

DatenzugriffBetreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Ich habe noch nicht nachverfolgt, ob alle diese Fragen in anderen Beiträgen beantwortet wurden, aber zwei Gedanken:
- Wenn Sie die Reihenfolge der Parameter beibehalten möchten, können Sie Arrays innerhalb Ihres assoziativen Arrays verwenden, etwa so:
AA = Associative Array( {
{"Choice_A", [
//Array of here to maintain order<BR /> ["name" => "param_1", "default" => 2],
["name" => "param_2", "default" => 15],
["name" => "param_3", "default" => .],
]}
} )
- Sie könnten die Breite des Textfelds und des Zahlenbearbeitungsfelds angeben, um alles in einer Linie zu halten, oder Sie könnten stattdessen eine Tabelle mit verwenden Bearbeitungsfelder für Zahlenspalten .
Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Assoziative Bereiche haben keine Ordnung. Eines kann man nicht durchsetzen. JMP ordnet die Ergebnisse nur aus praktischen Gründen an, wenn Sie den Inhalt mit einer Meldung wie „<< Schlüssel abrufen“ untersuchen.
Names Default to Here( 1 );
// load an associative array in order of C, B, A
aa = Associative Array();
aa["Choice_C"] = ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123];
aa["Choice_B"] = ["param 1" => 2, "param 3" => 10, "param 4" => .];
aa["Choice_A"] = ["param_1" => 2, "param 2" => 15, "param_4" => .];
// examine associative array as a whole (JMP orders output, not content, alphanumerically)
Show(
aa << Get Keys,
aa << Get Values,
aa
);
// examine associative array one entry at a time
i = aa << First;
While( Not( Is Empty( i ) ),
Show( aa[i] );
i = aa << Next( i );
);
Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Sie können den Dialog wie folgt modal gestalten.
Um eine Rückruffunktion zu erstellen, müssen Sie verhindern, dass die AAs bei jedem Öffnen des Fensters neu initialisiert werden, indem Sie die AAs in einem anderen Teil des Codes initialisieren, der von dem Code, der zum Anzeigen des Fensters verwendet wird, getrennt werden kann.
Jedes Mal, wenn die Schaltfläche „OK“ gedrückt wird, können Sie zusätzlich zum bereits erfolgten Speichern der neuen Werte in der entsprechenden AA die Einstellungen in globalen (oder vorzugsweise bereichsbezogenen) Variablen speichern und die Werte dieser Variablen zum Auffüllen verwenden Dialog, wenn das nächste Mal „Abrufen“ gedrückt wird.
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx", <<MODAL></MODAL>Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Hallo Brady,
Vielen Dank für Ihre schnelle Antwort.
Ich habe mir Ihr Skript genau angesehen, damit experimentiert und einige Aktualisierungen daran vorgenommen.
Ich habe noch ein paar Fragen/Anmerkungen, wenn es Ihnen nichts ausmacht:
- Die Aufteilung der Haupt-AA in mehrere AAs, eine für jede Option, ist für mich in Ordnung
- Könnte Ihr Skript angepasst werden, damit das Fenster modal ist?
Ich würde es vorziehen, die Fensteroberfläche einzufrieren und sie sofort zu schließen, sobald der Benutzer auf „Ok“ klickt. - Kann dieser Schnittstelle problemlos eine funktionierende „Rückruf“-Schaltflächenbox hinzugefügt werden?
- Abschließend habe ich Ihrem aktualisierten Skript einen Kommentar hinzugefügt, um zu erklären, was ich zu tun versuche.
Danke nochmal für deine Hilfe.
Beifall,
François
Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Hallo @ich h ,
Vielen Dank für Ihre schnelle Antwort.
Ich habe mir Ihr Skript mit Fenstervariablen genau angesehen.
Ich habe damit gespielt und einige Updates daran vorgenommen.
Ich habe noch ein paar Fragen/Anmerkungen, wenn es Ihnen nichts ausmacht:
- Ein Problem besteht für mich darin, dass die Reihenfolge der einzugebenden Parameter nicht der Reihenfolge entspricht, in der ich sie in das Assoziative Array eingefügt habe.
Ich hätte sie gerne in der gleichen Reihenfolge wie in der AA-Definition. Ist das möglich ? - Kann das Layout der Paare (TextBox, Number Edit Box) so verbessert werden, dass sie in zwei getrennten Spalten ausgerichtet sind (ich füge zur Veranschaulichung einen Screenshot hinzu – erstellt mit LineUp Box-)?
Ich habe auch versucht, die V List Box (window:vlbParam) durch eine Table Box zu ersetzen, bisher ohne Erfolg. - Kann dieser Schnittstelle problemlos eine funktionierende „Rückruf“-Schaltflächenbox hinzugefügt werden?
- Abschließend habe ich Ihrem aktualisierten Skript einen Kommentar hinzugefügt, um zu erklären, was ich zu tun versuche.
Danke noch einmal !
Grüße,
François
Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Hallo,
Ein relativ effizienter Weg, dies zu tun, ist wie folgt.
1) Definieren Sie Parameter-/Wertesätze in AAs, ein AA für jede Option.
2) Platzieren Sie diese AAs in einem „Haupt“-AA.
3) Verwenden Sie die Combobox, um innerhalb der „Haupt“-AA auszuwählen
4) Zeigen Sie für jede Auswahl ein einzelnes Tabellenfeld an (nachdem Sie das aktuelle gelöscht haben, falls vorhanden), dessen Zeilen den Einträgen in der entsprechenden Option AA entsprechen.
5) Wenn die Schaltfläche „Los“ gedrückt wird, ist es einfach, die entsprechende „Option“ AA mit den vorgenommenen Eingaben zu aktualisieren und fortzufahren. Hier wird die mainAA in das Protokoll geschrieben, sodass Sie deren Inhalt nach jedem Drücken sehen können.
Beifall,
Brady
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx",
V List Box(
cb = Combo Box(
mainAA << get keys,
Try( TB << delete );
tableVLB << append(
tb = Table Box(
TbSCB = String Col Box( "parameter", mainAA[cb << get selected] << Get Keys ),
TbNCEB = Number Col Edit Box( "value", mainAA[cb << get selected] << Get Values )
)
);
),
tableVLB = V List Box(),
bb = Button Box( "Go",
mainAA[cb << get selected] = Associative Array( TbSCB << get, TbNCEB << get );
Show( mainAA );
)
)
);
eval(cb << get function);

Betreff: Den Inhalt einer DisplayBox mit einem Associate Array aktualisieren, wenn sich die Auswahl einer ComboBox ändert?Hallo @fch_jmp ,
Wenn ich Ihre Frage richtig verstehe, denke ich, dass dies das ist, was Sie suchen:
Names default to here(1);
AA = Associative Array( {
{"Choice_A", ["param_1" => 2, "param 2" => 15, "param_4" => .]},
{"Choice_B", ["param 1" => 2, "param 3" => 10, "param 4" => .]},
{"Choice_C", ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123]}
} );
//return a label and
parambox = function({name,val},
h list box(
text box(name),
nebParam[name] = number edit box(val)
)
);
updateparams = function({},
while( !is empty( vlbParams << child ), (vlbParams << child) << delete );
nebParam = Associative Array();
for each({{param, value}, i}, AA[cb << GetSelected()],
vlbParams << append(
parambox(param, value)
);
)
);
win = new window("cb test",
cb = Combo Box(
AA << Get Keys,
updateparams();
),
vlbParams = v list box(),
button box("Write to the log",
for each({{param, value}}, nebParam, print(param || ": " || char(value << get)));
)
);
cb << set(1);
updateparams();
Beachten Sie, dass bei dieser Methode mehrere Fenster miteinander kollidieren könnten, sodass ich tatsächlich Fenstervariablen verwenden würde. Versuchen Sie, dies einmal auszuführen, ändern Sie Ihr Parameter-Array, führen Sie es dann erneut aus und achten Sie darauf, wie beide Fenster unabhängig voneinander funktionieren.
Mehr sehen...