Có một số cách để build a GUI, chẳng hạn như sử dụng App Designer, GUIDE hoặc tạo nó theo chương trình (Tôi sẽ minh họa tùy chọn này bên dưới). Điều quan trọng cần lưu ý là different ways to define callback functions cho các thành phần GUI của bạn và options available for sharing data between components.
Cách tiếp cận mà tôi đang sử dụng là sử dụng nested functions làm gọi lại. Dưới đây là một giao diện đơn giản như một ví dụ:
function make_useless_button()
% Initialize variables and graphics:
iCounter = 0;
hFigure = figure;
hButton = uicontrol('Style', 'pushbutton', 'Parent', hFigure, ...
'String', 'Blah', 'Callback', @increment);
% Nested callback function:
function increment(~, ~)
iCounter = iCounter+1;
disp(iCounter);
end
end
Khi bạn chạy mã này, bộ đếm hiển thị nên tăng bởi một mỗi khi bạn nhấn nút, bởi vì hàm lồng nhau increment
có quyền truy cập vào các không gian làm việc của make_useless_button
và do đó có thể sửa đổi iCounter
. Lưu ý rằng nút gọi lại được đặt thành function handle đến increment
và chức năng này phải chấp nhận hai đối số theo mặc định: một xử lý đồ họa cho thành phần giao diện người dùng đã kích hoạt gọi lại và cấu trúc dữ liệu sự kiện được liên kết. Chúng tôi ignore them with the ~
trong trường hợp này vì chúng tôi không sử dụng chúng.
Mở rộng phương pháp trên để vấn đề cụ thể của bạn, bạn có thể thêm vòng lặp của bạn và thay đổi callback để nó đặt biến lá cờ của bạn false:
function make_stop_button()
% Initialize variables and graphics:
keepLooping = true;
hFigure = figure;
hButton = uicontrol('Style', 'pushbutton', 'Parent', hFigure, ...
'String', 'Stop', 'Callback', @stop_fcn);
% Keep looping until the button is pressed:
while keepLooping,
drawnow;
end
% Delete the figure:
delete(hFigure);
% Nested callback function:
function stop_fcn(~, ~)
keepLooping = false;
end
end
Các drawnow
là cần thiết vào đây để cung cấp cho các nút gọi lại một cơ hội để làm gián đoạn luồng chương trình trong vòng lặp và sửa đổi giá trị của keepLooping
.
OP sẽ cần thay đổi biến đầu ra thành biến khác và tạo "myvar chung" trong vùng làm việc cơ sở để làm việc này. – Azim
Đây có phải là cách duy nhất không? Nó có vẻ là loại cùn để sử dụng variales toàn cầu cho công việc. – bastibe
Đó là cách tốt nhất mà tôi đã đưa ra - Tôi đồng ý rằng nó hơi xấu xí, tôi không nghĩ rằng mô hình GUI Matlab là rất tốt. Bạn có thể muốn kiểm tra mã trong phần đóng góp uitable (?) Trên Mathworks. Trang web giảm xuống vào phút. –