当组合框的选择发生变化时,用关联数组更新显示框的内容?[版本:JMP Pro 16.2.0]
你好,
我正在尝试为脚本构建一个界面窗口:
- 将当前数据表发送到Python并获取用户输入的参数值,
- 在Python中执行一些操作,
- 将 Python DataFrame 中的一些列添加到当前数据表中。
我添加了我想要的界面布局作为附件。
我还没想好如何更新提示用户输入的参数内容根据用户在上面的组合框中选择的选项。
为了使代码更易于维护并避免代码冗余(对我来说很重要,因为我计划在组合框中有很多选项),我想将参数及其默认值存储在脚本顶部的关联数组中。 每个选项的参数数量可能不同。
我查看了这个插件的代码( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 )但不幸的是,要显示的字段及其关联的数字编辑框值是硬编码的。
感谢您的帮助。
此致,
弗朗索瓦
#伊曼纽尔_罗梅乌
#詹姆斯_巴克
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
]
}
}
);

数据存取回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?我还没有跟踪所有这些是否在其他帖子中得到了回答,但有两个想法:
- 如果你想保持参数有序,你可以在关联数组中使用数组,如下所示:
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" => .],
]}
} )
- 您可以指定文本框和数字编辑框的宽度以使所有内容对齐,或者您可以使用带有编号编辑框。
回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?关联区域没有顺序。 你不能强加一个。 JMP 对结果进行排序只是为了方便您使用诸如 << 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 );
);
回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?您可以使对话框成为模式对话框,如下所示。
要创建召回功能,您需要通过在代码的另一部分中初始化 AA(可以与用于显示窗口的代码分开)来防止每次打开窗口时重新初始化 AA。
每次按下 OK 按钮时,除了像已经完成的那样将新值保存到相应的 AA 之外,您还可以将设置保存到全局(或者最好是范围内的)变量,并使用这些变量的值来填充下次按下“调用”时会出现对话框。
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>回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?嗨布雷迪,
感谢你的及时回复。
我仔细查看了您的脚本,进行了试验并对其进行了一些更新。
如果您不介意的话,我还有几个问题/意见:
- 将主 AA 分成几个 AA,每个选项一个对我来说就可以了
- 您的脚本可以修改以使窗口成为模态窗口吗?
我更愿意冻结窗口界面并在用户单击“确定”后立即关闭它。 - 可以将有效的“召回”按钮框轻松添加到此界面吗?
- 最后,我在您更新的脚本中添加了一些评论,以解释我想要做什么。
再次感谢你的帮助。
干杯,
弗朗索瓦
回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?你好@ih ,
感谢你的及时回复。
我仔细查看了您的带有窗口变量的脚本。
我玩过它并对其进行了一些更新。
如果您不介意的话,我还有几个问题/意见:
- 对我来说,一个问题是要输入的参数的顺序与我将它们放入关联数组中的顺序不同。
我希望它们的顺序与 AA 定义中的顺序相同。 那可能吗 ? - 可以改进对的布局(文本框、数字编辑框),使它们在两个单独的列中对齐(我添加屏幕截图来说明 - 使用 LineUp Box 完成 - )
我还尝试用表格框替换 V 列表框(窗口:vlbParam),但到目前为止没有成功。 - 可以将有效的“召回”按钮框轻松添加到此界面吗?
- 最后,我在您更新的脚本中添加了一些评论,以解释我想要做什么。
再次感谢 !
问候,
弗朗索瓦
回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?你好,
一种相对有效的方法如下。
1) 在 AA 中定义参数/值集,每个选项一个 AA。
2) 将这些 AA 放在“主”AA 中。
3) 使用组合框在“主”AA 中进行选择
4) 对于任何选择,显示单个表格框(删除当前表格框后,如果存在),其行对应于相关选项 AA 中的条目。
5) 当按下“开始”按钮时,可以很容易地用已进行的任何输入来更新相关的“选项”AA,并继续。 在这里,mainAA 被写入日志,以便您可以在每次按下后看到其内容。
干杯,
布雷迪
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);

回复:当组合框的选择发生变化时,用关联数组更新显示框的内容?你好@fch_jmp ,
如果我正确理解你的问题,那么我认为这符合你的要求:
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();
请注意,使用此方法多个窗口可能会相互碰撞,因此我实际上会使用窗口变量。 尝试运行一次,更改参数数组,然后再次运行它并注意两个窗口如何独立工作。
查看更多...