我的简单第一个调色板假设为:
$Path
ActionMenu["test",{"The Simple Packages Path":> AppendTo[$Path, ToFileName[{NotebookDirectory[], "02 Simple Packages"}]]}]
ActionMenu["Load Packages", {"Get my package":> Get["myPackage`"]}]
OpenerView[{"my Package", Button["construct", Paste[StandardForm@Defer@construct[Placeholder["description"],Placeholder["another description"]]]]}]
问题是当我点击“获取我的包”操作菜单项时,我不断收到“影子”消息。我确信我不是故意加载包装的。当我点击“构造”时,它会写Global`construct["description","another description"]
。但是我确定在获得包之前我没有定义它(我在测试中杀死了内核)。
你知道出了什么问题吗?
(我在我的包上使用Get
而不是Needs
,以确保包上下文的干净启动)
另外:您是否知道一种更简单的方法Paste[StandardForm@Defer...
,即使没有选择单元格,也可以确保未评估粘贴表达式并进入输入单元格?
答案 0 :(得分:6)
好吧,您的问题似乎是由于解析和界面创建之间的相互作用。在这种情况下你想要的是延迟解析你的界面中的包符号 - 构建代码(你在按钮动作函数中使用的包符号),从界面创建时间到“按下按钮”时间(假设到那个时候,包已经加载了)。这是一种方法:
Column[{ActionMenu["Load Packages",
{"Get my package" :> Get["ANOVA`"]}],
OpenerView[{"ANOVA", Button["construct",
With[{sym = Symbol["ANOVA"]},
Paste[StandardForm@Defer@sym[Placeholder["DATA"]]]]]}]}]
我们在这里做的是使用With
将符号注入到按钮功能的代码中。但是,在解析接口代码时,我们会阻止使用此名称创建Global
符号 - 否则会发生这种情况,这就是导致问题的原因。
修改强>
如果您确定只使用包中的符号(函数)而不是Global'
上下文中的符号(函数),那么这个版本将受到“保护”,不会出现此问题:{{1}生成的符号,如果它的上下文结果是Remove
- 因此在加载包之前按下按钮只会产生一条警告消息(我使用符号Global'
将消息附加到 - 应该用你的界面名称替换 - 制作函数):
package
答案 1 :(得分:2)
好吧,我没有你的包,所以为了测试我改变了动作菜单以获得ANOVA包:
ActionMenu["Load Packages", {"Get my package" :> Get["ANOVA`"]}]
ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}]
现在可以毫无障碍地运作。没有关于阴影的投诉。这表明你的阴影问题的原因在于其他地方。不过,我注意到ANOVA
这个词保持蓝色。这与您报告的问题here有关。