В вашей нынешней реализации счетчика цикл while
в обратном вызове startStop_togglebutton
активируется при первом нажатии кнопки Start
.
Он продолжает работать до состояния (счетчик < 10), даже если вы снова нажмете кнопку ushbutton на Stop
счет.
Поэтому, чтобы исправить эту проблему, вы можете использовать value
startStop_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');
Надеется, что это помогает.
@ даш-г Спасибо за редактирование :) – Tarek