Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?[Version : JMP Pro 16.2.0]
Bonjour,
J'essaie de créer une fenêtre d'interface pour un script qui :
- envoie la table de données actuelle à Python et obtient les valeurs saisies par l'utilisateur pour les paramètres,
- effectue certaines actions en Python,
- ajoute des colonnes d'un Python DataFrame à la table de données actuelle.
J'ai ajouté en pièce jointe la mise en page que j'ai en tête pour l'interface.
Je n'ai pas encore compris comment mettre à jour le contenu des paramètres que j'invite l'utilisateur à entrer selon l'option sélectionnée par l'utilisateur dans le ComboBox ci-dessus.
Pour faciliter la maintenance du code et éviter la redondance de code (important pour moi car je prévois d'avoir de nombreuses options dans le ComboBox), j'aimerais stocker les paramètres et leurs valeurs par défaut dans un tableau associatif au-dessus du script. Le nombre de paramètres pour chaque option peut être différent.
J'ai regardé le code de ce complément ( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 ) mais malheureusement, les champs à afficher et leurs valeurs de boîtes d'édition de nombre associées sont codés en dur.
Merci pour votre aide.
Cordialement,
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
]
}
}
);

Accès aux donnéesRe : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Je n'ai pas encore suivi si toutes ces réponses sont répondues dans d'autres articles, mais deux réflexions:
- Si vous voulez garder les paramètres ordonnés, vous pouvez utiliser des tableaux à l'intérieur de votre tableau associatif, comme ceci :
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" => .],
]}
} )
- Vous pouvez spécifier la largeur de la zone de texte et de la zone d'édition numérique pour que tout soit aligné, ou vous pouvez à la place utiliser un tableau avec nombre de boîtes d'édition de col .
Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Les espaces associatifs n'ont pas d'ordre. Vous ne pouvez pas en imposer un. JMP classe les résultats uniquement par commodité lorsque vous examinez le contenu avec un message tel que << Get Keys.
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 );
);
Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Vous pouvez rendre la boîte de dialogue modale, comme ci-dessous.
Pour faire une fonction de rappel, il faudra éviter de réinitialiser les AA à chaque ouverture de la fenêtre, en initialisant les AA dans une autre partie du code, qui peut être séparée du code utilisé pour afficher la fenêtre.
Chaque fois que vous appuyez sur le bouton OK, en plus d'enregistrer les nouvelles valeurs dans l'AA approprié comme cela est déjà fait, vous pouvez enregistrer les paramètres dans des variables globales (ou, de préférence, délimitées) et utiliser les valeurs de ces variables pour remplir le dialogue la prochaine fois que "recall" est pressé.
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>Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Salut Brady,
Merci pour votre réponse rapide.
J'ai examiné de près votre script, l'ai expérimenté et y ai apporté quelques mises à jour.
J'ai encore quelques questions/remarques si cela ne vous dérange pas :
- Diviser l'AA principal en plusieurs AA, un pour chaque option me convient
- Votre script pourrait-il être adapté pour que la fenêtre soit modale ?
Je préférerais geler l'interface de la fenêtre et la fermer immédiatement une fois que l'utilisateur aura cliqué sur "Ok". - Une Button Box "rappel" fonctionnelle peut-elle être facilement ajoutée à cette interface ?
- Enfin, j'ai ajouté un commentaire à votre script mis à jour pour expliquer ce que j'essaie de faire.
Merci encore pour votre aide.
Acclamations,
François
Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Salut @ih ,
Merci pour votre réponse rapide.
J'ai examiné de près votre script avec des variables de fenêtre.
J'ai joué avec et fait quelques mises à jour.
J'ai encore quelques questions/remarques si cela ne vous dérange pas :
- Un problème pour moi est que l'ordre des paramètres à entrer ne suit pas l'ordre dans lequel je les ai mis dans le tableau associatif.
Je voudrais les avoir dans le même ordre que celui de la définition AA. Est-ce possible ? - La disposition des couples (TextBox, Number Edit Box) peut-elle être améliorée de manière à ce qu'ils soient alignés dans deux colonnes séparées (j'ajoute une capture d'écran pour illustrer - réalisée à l'aide de LineUp Box-)
J'ai également essayé de remplacer la V List Box (window:vlbParam) par une Table Box, sans succès jusqu'à présent. - Une Button Box "rappel" fonctionnelle peut-elle être facilement ajoutée à cette interface ?
- Enfin, j'ai ajouté un commentaire à votre script mis à jour pour expliquer ce que j'essaie de faire.
Merci encore !
Salutations,
François
Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Salut,
Une façon relativement efficace de le faire est la suivante.
1) Définissez les ensembles de paramètres/valeurs en AA, un AA pour chaque option.
2) Placez ces AA dans un AA "principal".
3) Utilisez la liste déroulante pour sélectionner dans le "principal" AA
4) Pour toute sélection, faire apparaître une seule tablebox (après avoir supprimé celle en cours, si présente), dont les lignes correspondent aux entrées de l'option AA correspondante.
5) Lorsque le bouton "go" est enfoncé, il est facile de mettre à jour l'"option" AA pertinente avec toutes les entrées qui ont été faites, et de continuer. Ici, le mainAA est écrit dans le journal afin que vous puissiez voir son contenu après chaque pression.
Acclamations,
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);

Re : Mettre à jour le contenu d'un DisplayBox avec un Associate Array lorsque la sélection d'un ComboBox change ?Salut @fch_jmp ,
Si j'ai bien compris votre question, je pense que cela fait ce que vous recherchez:
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();
Notez qu'avec cette méthode, plusieurs fenêtres peuvent entrer en collision les unes avec les autres, j'utiliserais donc des variables de fenêtre. Essayez de l'exécuter une fois, modifiez votre tableau de paramètres, puis exécutez-le à nouveau et notez comment les deux fenêtres fonctionnent indépendamment.
Voir plus...