Aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?[Versione: JMP Pro 16.2.0]
Ciao,
Sto cercando di creare una finestra di interfaccia per uno script che:
- invia la tabella di dati corrente a Python e ottiene i valori di input dell'utente per i parametri,
- esegue alcune azioni in Python,
- aggiunge alcune colonne da un DataFrame Python alla tabella dati corrente.
Ho aggiunto come allegato il layout che ho in mente per l'interfaccia.
Non ho ancora capito come aggiornare il contenuto dei parametri che chiedo all'utente di inserire a seconda di l'opzione selezionata dall'utente nel ComboBox sopra.
Per semplificare la manutenzione del codice ed evitare la ridondanza del codice (importante per me perché ho intenzione di avere molte opzioni nel ComboBox), vorrei memorizzare i parametri ei loro valori predefiniti in un array associativo sopra lo script. Il numero di parametri per ciascuna opzione potrebbe essere diverso.
Ho guardato il codice di questo componente aggiuntivo ( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 ) ma sfortunatamente, i campi da visualizzare e i valori delle caselle di modifica numerica associati sono codificati.
Grazie per l'aiuto.
Distinti saluti,
Francesco
#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
]
}
}
);

Accesso ai datiRi: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?Non ho ancora tenuto traccia della risposta a tutte queste domande in altri post, ma due pensieri:
- Se vuoi mantenere i parametri ordinati puoi usare gli array all'interno del tuo array associativo, in questo modo:
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" => .],
]}
} )
- È possibile specificare la larghezza della casella di testo e della casella di modifica del numero per allineare tutto, oppure è possibile utilizzare una tabella con caselle di modifica numero col .
Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?Le aree associative non hanno ordine. Non puoi imporne uno. JMP ordina i risultati solo per comodità quando si esaminano i contenuti con un messaggio come << Ottieni chiavi.
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 );
);
Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?Puoi rendere la finestra di dialogo modale, come di seguito.
Per effettuare una funzione di richiamo sarà necessario evitare di reinizializzare gli AA ogni volta che si apre la finestra, inizializzando gli AA in un'altra parte del codice, che può essere separata dal codice utilizzato per mostrare la finestra.
Ogni volta che si preme il pulsante OK, oltre a salvare i nuovi valori nell'AA appropriato come è già stato fatto, è possibile salvare le impostazioni su variabili globali (o, preferibilmente, con ambito) e utilizzare i valori di queste variabili per popolare il finestra di dialogo la prossima volta che si preme "recall".
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>Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?Ciao Brady,
Grazie per la pronta risposta.
Ho dato un'occhiata da vicino al tuo script, l'ho sperimentato e ho apportato alcuni aggiornamenti.
Ho ancora alcune domande/osservazioni se non ti dispiace:
- Dividere l'AA principale in più AA, uno per ogni opzione va bene per me
- Il tuo script potrebbe essere adattato in modo che la finestra sia modale?
Preferirei bloccare l'interfaccia della finestra e chiuderla immediatamente una volta che l'utente fa clic su "Ok". - È possibile aggiungere facilmente a questa interfaccia una casella pulsante di "richiamo" funzionante?
- Infine, ho aggiunto alcuni commenti al tuo script aggiornato per spiegare cosa sto cercando di fare.
Grazie ancora per il vostro aiuto.
Saluti,
Francesco
Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?CIAO @ih ,
Grazie per la pronta risposta.
Ho dato un'occhiata da vicino al tuo script con le variabili della finestra.
Ci ho giocato e ho apportato alcuni aggiornamenti.
Ho ancora alcune domande/osservazioni se non ti dispiace:
- Un problema per me è che l'ordine dei parametri da inserire non segue l'ordine in cui li ho inseriti nell'array associativo.
Mi piacerebbe averli nello stesso ordine di quello nella definizione AA. È possibile ? - Il layout delle coppie (TextBox, Number Edit Box) può essere migliorato in modo tale che siano allineate in due colonne separate (aggiungo uno screenshot per illustrare - fatto usando LineUp Box-)
Ho anche provato a sostituire la V List Box (window:vlbParam) con una Table Box, finora senza successo. - È possibile aggiungere facilmente a questa interfaccia una casella pulsante di "richiamo" funzionante?
- Infine, ho aggiunto alcuni commenti al tuo script aggiornato per spiegare cosa sto cercando di fare.
Grazie ancora !
Saluti,
Francesco
Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?CIAO,
Un modo relativamente efficiente per farlo è il seguente.
1) Definire gli insiemi di parametri/valori in AA, un AA per ciascuna opzione.
2) Posiziona questi AA in un AA "principale".
3) Utilizzare la casella combinata per selezionare all'interno dell'AA "principale".
4) Per ogni selezione, affiorare un'unica tablebox (dopo aver cancellato quella corrente, se presente), le cui righe corrispondono alle entry nella relativa opzione AA.
5) Quando si preme il pulsante "vai", è facile aggiornare la relativa "opzione" AA con qualsiasi inserimento effettuato e procedere. Qui, il mainAA viene scritto nel registro in modo che tu possa vederne il contenuto dopo ogni pressione.
Saluti,
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);

Ri: aggiornare il contenuto di un DisplayBox con un Associate Array quando la selezione di un ComboBox cambia?CIAO @fch_jmp ,
Se ho capito correttamente la tua domanda, penso che questo faccia quello che stai cercando:
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();
Si noti che con questo metodo più finestre potrebbero entrare in collisione tra loro, quindi utilizzerei effettivamente le variabili della finestra. Prova a eseguirlo una volta, modifica l'array dei parametri, quindi eseguilo di nuovo e osserva come entrambe le finestre funzionano in modo indipendente.
Visualizza altro...