2012-01-13 55 views
6

Tôi đã tạo một phép thử [], cũng có thể là một phép thử biểu tượng, nếu cần, và tôi đang cố gắng thực hiện nó trong một thao tác. kiểm tra [] trông như sau:Bộ điều khiển tùy chỉnh cho thao tác [] trong Mathematica

test[]:=Button["Label",Functionality[]]; 

này sẽ trả về một lỗi nếu sử dụng trực tiếp trong một thao tác [], nhưng hoạt động nếu nó được bọc trong một động hoặc một Đánh giá.

Manipulate[content,test[]]; 

Thao tác :: vsform: Thao tác kiểm tra lập luận [] không có hình thức chính xác cho một đặc điểm kỹ thuật khác nhau.

Manipulate[content,Dynamic[test[]]] 

một này hoạt động

Manipulate[content,Evaluate[test]] 

Lưu ý rằng trong khi làm việc này, kiểm tra không phải là một chức năng

Manipulate[content,Evaluate[test[]]] 

này hoạt động trên mac của tôi, nhưng không phải máy tính của tôi tại nơi làm việc. ..

Tôi nghĩ rằng vấn đề là điều cần làm với Thao tác là H oldAll, nhưng không hiểu tại sao Dynamic [] nên sửa lỗi này. Ngoài ra, Đánh giá [] sẽ chỉ hoạt động trong một khoảng thời gian.

Vì vậy, tại sao Dynamic [] hoặc Evaluate [] cần thiết? Nhìn vào phần bộ điều khiển tùy chỉnh của hướng dẫn thao tác nâng cao, tôi không thấy tham chiếu đến vấn đề này và không thể tìm thấy bất kỳ nơi nào khác.

+3

bạn có thể đăng mã làm việc hoàn chỉnh, khép kín mà bạn có thể sao chép và dán không? bao gồm tất cả các định nghĩa bạn hiển thị ở đó? tạo một ví dụ nhỏ cho thấy vấn đề. Hiển thị một dòng từ đây và ở đó, với các biểu tượng không được xác định, khiến bạn khó có thể giúp bạn. Tôi không thấy những gì bạn nói làm việc cho bạn thực sự có thể làm việc. Nhưng bạn không hiển thị mã hoàn chỉnh, vì vậy có thể có điều gì đó đang diễn ra. – Nasser

Trả lời

8

Bạn có thể nội tuyến Button thay vì sử dụng chức năng test[] riêng biệt. Nếu không, ví dụ cuối cùng của bạn, Manipulate[content,Evaluate[test[]]], sẽ hiển thị nút trên máy của tôi trong Mathematica 8. Sẽ không có sự khác biệt giữa các nền tảng (Windows hoặc Mac).

Nếu bạn đang làm điều gì đó khác biệt so với những gì Manipulate cung cấp theo mặc định, bạn có thể thấy thuận tiện hơn khi xây dựng từ đầu bằng cách sử dụng Dynamic (đây là những gì tôi thường làm).


Dưới đây là ví dụ về cách bao gồm một số nút làm bộ điều khiển.

Thứ nhất, thiết lập một cái gì đó để hiển thị bên trong Manipulate:

rotate90[{x_, y_}] := {-y, x} 

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1], 
    koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
    n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
    p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]} 

koch[p1_, p2_, 0] := Line[{p1, p2}] 

snowflake[n_] := 
Graphics[{koch[{0, 0}, {1, 0}, n], 
    koch[{1, 0}, {1/2, -Sqrt[3]/2}, n], 
    koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}] 

Sau đó thiết lập Manipulate bản thân:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
Style["A Koch snowflake", Bold], Delimiter, 
Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]] 

Mathematica graphics


Dưới đây là một ví dụ cho thấy rằng điều này hoạt động ngay cả khi Button được định nghĩa trong một chức năng riêng biệt:

SetAttributes[paletteButton, HoldRest] 
paletteButton[name_, func_] := 
Button[name, func, Appearance -> "Palette"] 

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
Style["A Koch snowflake", Bold], Delimiter, 
[email protected]["+", n++]] 

Như bạn đề cập trong câu hỏi của bạn, ở đây nó là cần thiết để bọc các chức năng trong Evaluate để có được một inlined Button.Nếu không, Manipulate sẽ không thể nhận thấy rằng những gì chúng tôi có ở đây là điều khiển và không phải là một biến số .

Các vấn đề liên quan