Mouseover & Dynamic в Mathematica - PullRequest
       8

Mouseover & Dynamic в Mathematica

14 голосов
/ 30 ноября 2011

Может ли кто-нибудь указать, почему это не работает в Mathematica 8:

DynamicModule[{x = Pink},
 Row[
  {Style["Hello", x],
   Mouseover[
    x = Green; "World",
    x = Blue; "World"]}]]

Я ожидаю увидеть изменение цвета "Hello", когда наведу курсор мыши на "World". То, что я получаю, это розовый "Hello", который никогда не меняет цвет.

Ответы [ 5 ]

10 голосов
/ 30 ноября 2011

Думаю, я достаточно долго ждал, чтобы быть справедливым.Вот мое предложение:

DynamicModule[{x = Pink},
 Row[{
   Dynamic@Style["Hello", If[MouseAnnotation[] === 1, x = Green; Blue, x]],
   Annotation["World", 1, "Mouse"]
 }]
]
9 голосов
/ 30 ноября 2011

Попробуйте использовать EventHandler с "MouseEntered" и "MouseExited":

DynamicModule[{c = Pink}, Row[{
 Style["Hello", FontColor -> Dynamic[c]], 
 EventHandler[
  "World", {
   "MouseEntered" :> (c = Blue), 
   "MouseExited" :> (c = Green)
}]}]]
9 голосов
/ 30 ноября 2011

Если вы посмотрите на FullForm результата, вы увидите, что он содержит только последнюю часть каждого составного набора команд.Очевидно, Mouseover оценивает свои аргументы и сохраняет только результаты.

enter image description here

7 голосов
/ 30 ноября 2011

В качестве альтернативы вы можете сделать что-то вроде

DynamicModule[{col = Pink}, 
 Row[{Style["Hello ", FontColor -> Dynamic[col]], 
   Dynamic@If[CurrentValue["MouseOver"],
     col = Green; "World", 
     col = col /. Green -> Blue; "World"]}]
] 
7 голосов
/ 30 ноября 2011

Быстрая проверка показывает, что Mouseover оценивает все выражения внутри него при первом запуске:

Mouseover[Print["One"]; 1, Print["Two"]; 2]

Идиоматический способ заставить Mouseover изменить значения x -используйте MouseAnnotation.В ответе мистера Волшебника описывается, как этого добиться.

...