2015-06-27 2 views
1

Я хочу создать кнопку, которая работает как переключатель включения/выключения: если пользователь ее подталкивает, он начинает отсчет и отображает счетчик на статическом тексте. Если пользователь снова нажимает его, он перестает считать. Затем, если пользователь нажимает его в третий раз, он продолжает подсчитывать.кнопка переключения в Gui Matlab

Я попробовал этот код

function startStop_togglebutton_Callback(hObject, eventdata, handles) 
% hObject handle to startStop_togglebutton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of startStop_togglebutton 

persistent counter ; 

if isempty(counter) 

    counter = 0 ; 

end 

button_state = get(hObject,'Value'); 

if button_state == get(hObject,'Max') 

    set(handles.startStop_togglebutton,'String','Stop','ForegroundColor','red') 

    setappdata(handles.startStop_togglebutton,'sw',1) 

    while counter < 10 

     counter = counter+1; 

     set(handles.statusBar,'String',strcat(['the counter = ' num2str(counter) ])) 

     pause(1) 
    end 

    set(handles.startStop_togglebutton,'String','Finished','ForegroundColor','cyan') 
elseif button_state == get(hobject,'min') 

    set(handles.startstop_togglebutton,'string','resume','foregroundcolor','blue') 

    setappdata(handles.startstop_togglebutton,'sw',0) 
    set(handles.statusBar,'String',strcat([' stopped & the counter = ' num2str(counter) ' !'])) 

end 

, но он не работает правильно: Когда я нажимаю кнопку в первый раз, он начинает обратный отсчет, и когда я толкнул его во второй, раз это имя изменено но он все еще считал.

+0

@ даш-г Спасибо за редактирование :) – Tarek

ответ

1

В вашей нынешней реализации счетчика цикл while в обратном вызове startStop_togglebutton активируется при первом нажатии кнопки Start.

Он продолжает работать до состояния (счетчик < 10), даже если вы снова нажмете кнопку ushbutton на Stop счет.

Поэтому, чтобы исправить эту проблему, вы можете использовать valuestartStop_togglebutton insted из "1", чтобы увеличить счетчик.

Ниже вы можете найти обновленную версию обратного вызова. Я также добавил пару «if» блоков для управления отображением строк в statusbar

% --- Executes on button press in startStop_togglebutton. 
function startStop_togglebutton_Callback(hObject, eventdata, handles) 
% hObject handle to startStop_togglebutton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of startStop_togglebutton 

% hObject handle to startStop_togglebutton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of startStop_togglebutton 

persistent counter ; 

if isempty(counter) 

    counter = 0 ; 

end 

button_state = get(hObject,'Value'); 

if button_state == get(hObject,'Max') 

    set(handles.startStop_togglebutton,'String','Stop','ForegroundColor','red') 

    setappdata(handles.startStop_togglebutton,'sw',1) 

    while counter < 10 
% 
% Inserted acquisition of button state within the while loop 
% 
     button_state = get(hObject,'Value'); 
% 
% Modified the counter increment: 
% the increment is based on the status of the button 
% 
%  counter = counter+1; 
     counter = counter+button_state; 
% 
% Added "if" condition 
% The "statusbar" is updated only if counting is on 
% 
     if(button_state) 
      set(handles.statusBar,'String',strcat(['the counter = ' num2str(counter) ])) 
     end 

     pause(1) 
    end 

% 
% Added "if" condition 
% The "statusbar" is updatred only if counting is finished 
% 
if(counter == 10) 
    set(handles.startStop_togglebutton,'String','Finished','ForegroundColor','cyan') 
end 

elseif button_state == get(hObject,'min') 

    set(handles.startStop_togglebutton,'string','resume','foregroundcolor','blue') 

    setappdata(handles.startStop_togglebutton,'sw',0) 
    set(handles.statusBar,'String',strcat([' stopped & the counter = ' num2str(counter) ' !'])) 

end 

ОБНОВЛЕНИЕ ОТВЕТИТЬ НА COMMENT

Причина для использования value из togglebutton для увеличения счетчика следующее.

В первый раз, когда вы нажимаете togglebutton для запуска счетчика, цикл while активируется, и графический интерфейс «ожидает» другого обратного вызова, независимо от того, завершен цикл.

Кроме того, цикл while был закодирован в блок if, который захватывает действие «Пуск/Продолжение».

Это означает, что когда вы нажимаете переключатель, чтобы остановить счетчик, цикл while пропускается.

Получение значения переключателя в цикле while позволяет зафиксировать изменение статуса кнопки независимо от предполагаемого действия (Stop/Restart).

В самом деле, когда вы нажимаете ее, чтобы остановить счетчик, то value устанавливается в 0 поэтому не увеличивает счетчик, а при нажатии ее перезагрузки, его значение устанавливается в 1 и счетчик увеличивается на единицу.

Я предлагаю модель графического интерфейса счетчика иначе:

  • Чтобы закодировать счетчик в отдельном файле «.m» (или функции)
  • Для кодирования в этом " ,м «файл логики для приращения счетчика (на основе value в ToggleButton)
  • Чтобы добавить кнопку, которая запуск счетчика (» файл .m»)
  • Чтобы использовать startStop_togglebutton callbach только для обновления string отображается на ToggleButton

Манипулирование данными между графическим интерфейсом и файла «.m» осуществляется с помощью функции guidata.

«.m». файлы идентифицирует GUI через его tag (в коде, который я использовал для тестирования золя Я установил рисунок GUI tag как counter_gui).

Вы также должны установить свойство HandleVisibility вашего GUI к «на»

В дальнейшем вы можете найти:

  • обновленный startStop_togglebutton обратного вызова, в настоящее время очень простой
  • обратного вызова из кнопка, используемая для запуска счетчика
  • «.m» файл chich управляет счетчиком

startStop_togglebutton Ответного

% --- Executes on button press in startStop_togglebutton. 
function startStop_togglebutton_Callback(hObject, eventdata, handles) 
% hObject handle to startStop_togglebutton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of startStop_togglebutton 

% hObject handle to startStop_togglebutton (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

% Hint: get(hObject,'Value') returns toggle state of startStop_togglebutton 

button_state = get(hObject,'Value'); 

if(button_state == 1) 
    set(handles.startStop_togglebutton,'String','Stop','ForegroundColor','red') 
else 
    set(handles.startStop_togglebutton,'string','resume','foregroundcolor','blue') 
end 

run_counter обратный

% --- Executes on button press in run_counter. 
function run_counter_Callback(hObject, eventdata, handles) 
% hObject handle to run_counter (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

set(handles.startStop_togglebutton,'enable','on'); 
set(handles.startStop_togglebutton,'Value',1); 
set(handles.run_counter,'enable','off'); 
% Run the counter ".m" file 
run_counter; 

файл ".m" управление прилавком

% Get tha handle of the GUI figure 
gui_h=findobj('tag','counter_gui'); 
% Get gudata 
gui_my_data=guidata(gui_h); 

counter=0; 
while(counter < 10) 
    % Get togglebutton value 
    button_status=get(gui_my_data.startStop_togglebutton,'value'); 
    % Increment to counter only if the togglebutton is set to "Start/Resume" 
    counter=counter+button_status; 
    % Update strings 
    if(button_status) 
     set(gui_my_data.startStop_togglebutton,'String','Stop','ForegroundColor','red') 
     set(gui_my_data.statusBar,'String',strcat(['the counter = ' num2str(counter) ])) 
    else 
     set(gui_my_data.statusBar,'String',strcat([' stopped & the counter = ' num2str(counter) ' !'])) 
    end 
    pause(1); 
end 

set(gui_my_data.startStop_togglebutton,'String','Finished','ForegroundColor','cyan') 
set(gui_my_data.startStop_togglebutton,'enable','off'); 
set(gui_my_data.run_counter,'enable','on'); 

Надеется, что это помогает.

+0

Большое спасибо, это работает отлично , но не могли бы вы объяснить, почему вы изменили приращение счетчика и сделал его на основе состояния кнопки счетчик = счетчик + button_state; – Tarek

+0

Я добавил объяснение выше в ответ, поскольку он слишком длинный для раздела «комментарий». Вы можете найти его прямо под первым разделом кода. Кроме того, я добавил альтернативный способ кодирования счетчика. Кроме того, если ответ исправить вашу проблему, вы можете официально принять его. –

+0

Спасибо, второй метод работает хорошо, но я хочу только одну кнопку в графическом интерфейсе, пользователю не нужно нажимать две кнопки. Если есть другой способ сделать это, я благодарен вам – Tarek

Смежные вопросы