Наведение мыши и динамика в Mathematica

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

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

Я ожидаю, что цвет «Привет» изменится, когда я наведу указатель мыши на «Мир». Я получаю розовое «Привет», которое никогда не меняет цвет.


person gdelfino    schedule 29.11.2011    source источник
comment
Я считаю, что причина, по которой это не работает, заключается в том, что MouseOver оценивает выражения x = ... только один раз. Я недостаточно знаю, как вы можете добиться желаемого поведения.   -  person Mike Bailey    schedule 30.11.2011
comment
Ничего себе, я получил действительно хорошие ответы от всех вас. Я проголосовал за вас всех. Выбрать ответ действительно сложно. Сьорд и Майк очень хорошо объяснили, почему мой код не работает, о чем я и спросил. А Хайке, мистер Визард и Арно предложили, как решить проблему, о чем я и хотел спросить. СПАСИБО ВАМ ВСЕМ!   -  person gdelfino    schedule 30.11.2011


Ответы (5)


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

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

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

person Mike Bailey    schedule 29.11.2011

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

DynamicModule[{x = Pink},
 Row[{
   Dynamic@Style["Hello", If[MouseAnnotation[] === 1, x = Green; Blue, x]],
   Annotation["World", 1, "Mouse"]
 }]
]
person Mr.Wizard    schedule 30.11.2011
comment
Я бы ответил раньше, но мне пришлось уйти почти сразу после публикации моего ответа. Хотя это самое элегантное решение. - person Mike Bailey; 30.11.2011
comment
@ Майк, твой ответ, который я бы принял, если бы этот вопрос был моим. Это предельно лаконично и совершенно ясно. Этот ответ вообще не касается вопроса ОП; вполне возможно, что он знал о подобном методе до того, как спросил, и его интересовало только поведение Mouseover. - person Mr.Wizard; 30.11.2011

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

введите здесь описание изображения

person Sjoerd C. de Vries    schedule 29.11.2011

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

DynamicModule[{c = Pink}, Row[{
 Style["Hello", FontColor -> Dynamic[c]], 
 EventHandler[
  "World", {
   "MouseEntered" :> (c = Blue), 
   "MouseExited" :> (c = Green)
}]}]]
person Arnoud Buzing    schedule 30.11.2011
comment
Интересный. Есть ли причина, по которой вы не реализуете пример с помощью этого метода? - person Mr.Wizard; 30.11.2011
comment
@Mr.Wizard - Вы имеете в виду, почему Mouseover не ведет себя как EventHandler выше? Я должен проверить. - person Arnoud Buzing; 30.11.2011
comment
Нет, я думаю, что ответ Майка довольно хорошо показывает поведение Mouseover. Я просто имел в виду, есть ли причина, по которой вы не использовали этот метод для написания кода, который дает результат, который дает мой, чего, как я полагаю, пытался достичь ОП? - person Mr.Wizard; 30.11.2011
comment
Я подумал, что это больше иллюстрирует поведение EventHandler. Но я изменил его, чтобы он действовал как исходный пример. - person Arnoud Buzing; 30.11.2011
comment
Пожалуйста, поступайте так, как считаете нужным, но мне так понятнее. Однако это не работает; это только v8? - person Mr.Wizard; 30.11.2011
comment
@Mr.Wizard - Да, это новое в V8 (но теперь, когда я смотрю на это, очевидно, оно не задокументировано в EventHandler). - person Arnoud Buzing; 30.11.2011

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

DynamicModule[{col = Pink}, 
 Row[{Style["Hello ", FontColor -> Dynamic[col]], 
   Dynamic@If[CurrentValue["MouseOver"],
     col = Green; "World", 
     col = col /. Green -> Blue; "World"]}]
] 
person Heike    schedule 29.11.2011
comment
@Mr.Wizard: Да, я знаю. Я понял это позже, но надеялся, что никто не заметит, пока у меня не появится шанс исправить это (что у меня есть сейчас). - person Heike; 30.11.2011