2012-03-02 55 views
6

Tôi đang tạo trình xem dữ liệu thời gian thực đơn giản với các nút như phát, tạm dừng và trượt bằng MATLAB GUI. Sau khi người dùng nhấn thanh trượt phát cần phải được cập nhật từng bước (50 mẫu mỗi giây). Chức năng đó đang cản trở thanh trượt di chuyển theo cách thủ công (bạn phải di chuyển nó trong 1/50 giây). Bây giờ tôi đã thiết lập cập nhật của thanh trượt mỗi lần thứ 50 (vì vậy cứ sau mỗi giây) và nó hoạt động tốt, trừ khi bạn giữ thanh trượt lâu hơn thì phải mất để cập nhật.Buttondownfcn không hoạt động trên thanh trượt

Vấn đề là nếu thuộc tính thanh trượt Bật là, Buttondownfcn không hoạt động cho nhấp chuột trái (nó phù hợp với một bên phải). Sử dụng Buttondownfcn tôi sẽ có thể khóa cập nhật và giải quyết vấn đề hoàn toàn. Có cách nào để khắc phục điều này?

% --- Executes on slider movement. 
function slider_Callback(hObject, eventdata, handles) 
disp('Slider movement') 

% --- Executes on button down. 
function slider_ButtonDownFcn(hObject, eventdata, handles) 
disp('Button down') 
+3

bạn có thể hiển thị một số mã ví dụ tối thiểu không? – tim

+1

Nếu bạn muốn mô phỏng hành vi này chỉ cần bắt đầu MATLAB GUI và thêm một thanh trượt. Thêm Callback và ButtonDownFcn làm callbacks và thêm một số tin nhắn in như tôi đã làm bằng cách sử dụng disp. Sau đó, chỉ cần chuyển đổi giữa thuộc tính Enable (bật/tắt) và xem những gì sẽ xảy ra. –

Trả lời

1

Bạn có thể đạt được ngắt chơi bằng cách thiết lập Enable tài sản của thanh trượt của bạn để off hoặc inactive khi bạn nhấn nút play của bạn và sử dụng một hàm ButtonDownFcn mà dừng chơi và đặt Enable trở lại on.

Sử dụng một togglebutton như nút play của tôi (widget kiểm soát khác nên làm việc miễn là bạn có thể tiết kiệm một lá cờ boolean đâu đó truy cập), tôi đã sử dụng sau khi Callback cho nút:

function playcallback(toggle_button, ~, slider_) 
set(slider_, 'Enable', 'inactive'); %slider is disabled 
while get(toggle_button, 'Value') %Value is used as flag for playing 
    current_value = get(slider_, 'Value'); 
    set(slider_, 'Value', rem(current_value + 0.01, 1)); %shift slider (looping) 
    pause(1/50); 
end 
set(slider_, 'Enable', 'on'); %done playing, turn slider back on 
end 

Và sau như ButtonDownFcn cho thanh trượt:

function stopslide(~, ~, toggle_button) 
%play flag off: in playcallback, the while loop stops, 
%the slider is enabled and the playcallback function returns 
set(toggle_button, 'Value', 0); 
end 

Bạn có thể đăng ký các callbacks như thế này:

set(toggle_button_handle, 'Callback', {@playcallback, slider_handle}); 
set(slider_handle, 'ButtonDownFcn', {@stopslide, toggle_button_handle}); 

Lưu ý: nếu bạn bắt đầu thêm các tiện ích khác tương tác với nút trượt/phát theo cách tương tự như vậy, bạn sẽ tăng cơ hội giới thiệu các điều kiện của cuộc đua.

+0

Tôi biết tôi có thể làm điều đó nhưng sau đó bạn sẽ không thể thay đổi thời gian trong khi dữ liệu đang được sao chép và không thân thiện với người dùng :) –

+0

Ok. Tôi nghĩ rằng tôi không hoàn toàn hiểu cách bạn sử dụng thanh trượt trong GUI của bạn. Bạn đã có một ứng dụng ví dụ bạn muốn mô phỏng để hiển thị? Cho đến nay tôi hiểu nó theo cách sau: bạn lấy dữ liệu từ một nguồn bên ngoài (50 lần mỗi giây); bạn giữ một bộ đệm dữ liệu cho N mẫu; thanh trượt được sử dụng để chọn mẫu sẽ hiển thị; màn hình sẽ luôn cập nhật mỗi 1/50 giây, trừ khi bị tạm dừng. – AE426082

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