笔记本电脑的样式表是否会改变代码的行为?

16

我想问一下是否有人之前遇到过这样的问题。 我的版本是8.01,运行在 Windows 7 64 位SP1 上。

我一直试图找出为什么在我编写的代码中添加Tooltip[]命令时,Mathematica内核会崩溃。

笔记本电脑带有Wolfram演示样式表(用于制作演示文稿的示例样式表)。它是一个Manipulate,全部在一个单元格中。

当我将代码复制到具有默认样式表的新笔记本电脑中时,崩溃就消失了! 我无法在新笔记本电脑中重现崩溃。

完全没有代码更改。 只需将整个单元格复制并粘贴到新笔记本电脑中即可。唯一的区别是一个具有演示文稿样式表,另一个是默认样式表。当我将新笔记本电脑的样式表更改为Demostration时,我发现Tooltip的效果不如以前好。当我在此样式下使用示例笔记本电脑并开始移动鼠标时,内核崩溃。

为了确保,我多次尝试这样做。同样的结果。一旦我添加了Tooltip [],当样式表是演示时,内核立即崩溃。

我的问题:有人看到过这种行为吗? 如果可以的话,我可以提供这两个笔记本电脑。

我遇到的崩溃是:

Problem signature:
  Problem Event Name:   BEX64
  Application Name: Mathematica.exe
  Application Version:  8.0.31.32201
  Application Timestamp:    4d65e0e8
  Fault Module Name:    StackHash_2766
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp:   00000000
  Exception Offset: 0000000000000001
  Exception Code:   c0000005
  Exception Data:   0000000000000008
  OS Version:   6.1.7601.2.1.0.768.3
  Locale ID:    1033
  Additional Information 1: 2766
  Additional Information 2: 2766660d255034f6e73a8cd527b6f51e
  Additional Information 3: 8ab7
  Additional Information 4: 8ab74987ae95fade363a8e7256e3890f

我已向WRI发送了一个错误报告。

我的问题是:是否有人遇到过这样的问题,即样式表更改会使代码行为不同?为什么样式表更改会导致这样的问题?

更新1:

我已经能够创建一个小例子,展示部分问题。我正在努力制作另一个小例子,展示崩溃本身。但是下面的例子展示了问题,即当样式表为demonstration时,Tooltip的工作方式不同。首先,这里是一个屏幕截图,左边是默认样式表中的同一段代码,右边是演示样式表中的代码。

(在图片下方,我粘贴了源代码,并列出了如何重现该问题的步骤)

enter image description here

Manipulate[

EventHandler[Dynamic[Graphics[
{
Circle[{0,0},1],
Dynamic@Tooltip[Text[Style["O",Red,16] ,pt],Style[pt]]
},
ImageSize->250, PlotRange->{{-1,1},{-1,1}}
],ContinuousAction->True],

"MouseDragged":>
( pt=MousePosition["Graphics"] )
],

{{pt,{0,0}},ControlType->None},

TrackedSymbols:> {None},
ContinuousAction->True
]

步骤:

  1. 将上述代码粘贴到新的样式表中,使用默认样式。拖动点,您应该看到坐标一直显示,随着鼠标拖动点。
  2. 文件-> 新建->演示,并将相同的代码粘贴到替换已在那里的小模板的 Manipulate 单元格中。
  3. 现在做同样的事情,拖动点。您会发现工具提示不会像鼠标拖动时那样显示。只有在将鼠标保持稳定状态停留在点上时才会显示它。

动态效果似乎会导致这种不同的行为,或者是样式中的其他问题。

我尝试了不同的样式表,其中工具提示正常运行。只有在演示样式表中,我才遇到了这个工具提示的问题。

如果有人有解决办法,那就太好了。因为我想在演示中使用工具提示。

我将尝试制作一个也会导致崩溃的示例。

更新:

我已经从 WRI 技术支持中得到了回复。这是一个样式表问题。与此同时,作为技术支持的一个解决方法是:

I was able to reproduce the kernel crash. It looks like a demonstration
stylesheet issue related to imagesize fit. 
At the top of the demonstration notebook there is tab called 'Tools',
clicking on it gives you an option called 'Resize Notebook to Fit'. On
resizing the notebook and saving it the kernel crash does not happen.

感谢WRI技术支持。

2011年12月2日更新根据John Fultz下面的答案,我现在关闭了这个问题。谢谢John。


1
@yoda,听起来这里涉及到编程,所以问题是相关的。 - Joel Spolsky
4
我能想到的一件事是演示笔记本为本地符号名称使用独特的上下文(而不是“Global`”),这可能会产生影响,特别是如果您的代码依赖于在演示笔记本中未定义的函数。 - Brett Champion
2
@Nasser,您能否将技术支持的答案发布在这里并接受它作为您的答案?这样就可以将此问题从未回答的问题列表中移除了。 - Sjoerd C. de Vries
2
@Nasser,提示框未显示的原因是演示样式表在工具提示上设置了非零延迟。这会防止在拖动时显示工具提示。将选项BaseStyle -> {TooltipBoxOptions -> {TooltipDelay -> 0}}添加到您的Manipulate中以解决此问题。 - John Fultz
@JohnFultz,谢谢John。根据您的答案,我现在将关闭这个问题。(也许我会再等一下,如果您把它作为一个单独的答案,那么我可以接受它并关闭这个问题) - Nasser
显示剩余3条评论
1个回答

2

这个答案实际上是由John Fultz提供的 - 请参见原始问题下的评论。我将其转化为答案,以便该问题不再出现在未回答的问题列表中。显然,真正值得获得任何声望点数的是John;如果您在此处发布答案,那么我会投票并删除我的答案。

您的工具提示在演示版本中未显示的原因是Demonstration样式表对工具提示设置了非零延迟,因此它们只在悬停一定时间后才会出现。特别是,在拖动时它们不会出现。

您可以通过在Manipulate中设置延迟为零来反转这一过程;通过在Manipulate调用中添加以下选项来实现此目的。

BaseStyle -> {TooltipBoxOptions -> {TooltipDelay->0}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接