2

커다란 GUI에서 필수적인 구조는 매우 초보적이며 슬라이더와 편집 상자 인 두 개의 상호 연결된 컨트롤 (각각 하나는 다른 하나의 값을 업데이트 함)으로 간단하게 줄일 수 있습니다. 그들이 공유하는 가치는 음모 만들기에 사용됩니다. 다음 코드를 실행하면 슬라이드를 이동하거나 상자를 편집하여 값을 한 번만 변경할 수 있습니다. 두 번째로 오류가 발생합니다. 주요 질문은 다음과 같습니다. 왜? 대신에 어떻게 GUI를 사용해야합니까? 이 경우 guihandles가 작동하지 않는 이유는 무엇입니까?

function GuiHandleShare1 

handles.figure=figure; 

handles.edit=uicontrol('Style','Edit',... 
         'Position',[5 5 50 20],... 
         'Callback',@edit_callback,... 
         'Tag','edit'); 
handles.slider=uicontrol('Style','Slider',... 
         'Position',[55 5 500 20],... 
         'Callback',@slider_callback,... 
         'Tag','slider'); 
handles.axes=axes('OuterPosition',[0.1 0.1 0.8 0.8],... 
        'Tag','axes'); 

function plotter 
handles=guihandles; 
plot(handles.axes,[0 1],[0 str2num(get(handles.edit,'String'))]) 

function edit_callback(h,eventdata) 
handles=guihandles; 
set(handles.slider,'Value',str2num(get(handles.edit,'String'))); 
plotter 

function slider_callback(h,eventdata) 
handles=guihandles; 
set(handles.edit,'string',num2str(get(handles.slider,'Value'))); 
plotter 

나는 guihandles의 코드로 파고에 의해 답을 찾기 위해 노력했지만 단지 guidata, 그것은 사용할 수없는 소스있는 등 getappdata, setappdata, 래퍼, (matlab에 R2008b)입니다.

이미 이런 종류의 GUI에 대한 다른 해결책을 알고 있습니다. 1- guihandles, guidata 또는 다른 종류의 것을 사용하는 대신 전역 변수를 사용합니다. 2 중첩 된 함수를 사용하십시오.

중첩 된 함수는 주 함수 작업 영역을 정적 작업 영역으로 만들기 때문에 작업하고있는 경우 옵션이 아닙니다. 이것은 응용 프로그램에서 변수를 관리해야하기 때문에 내가 원하는 것이 아닙니다. 전역 변수 사용이 끝났습니다. 핸들을 필요로하는 모든 함수 내에서 핸들을 전역 변수로 선언 했으므로 제대로 작동합니다. 이것에는 어떤 단점이 있습니까? 우리가 전역 변수를 사용할 수 있다면, 왜 MATLAB은 guihandles, guidata 등과 같은 명령을 내놓았 을까요? 그렇지 않으면 GUI는 축과 관련된 첫번째 플롯 후 새로운 그림과 태그를 생성, 맨 처음에 당신의 축 정의에

'NextPlot' ,'ReplaceChildren' 

:

+0

각 플롯 앞에 축을 정의해야한다고 생각합니다. 즉, '핸들'을 추가하십시오.축 '을 플로터 기능 내에서 플롯 선 앞에 한 줄씩 표시합니다. 그렇지 않으면, 그는 아마도 어딘가에서, 같은 그림이나 다른 그림으로 그것을 그리거나 충돌하려고 시도 할 것입니다. – Adiel

답변

3

는이 속성/값 쌍을 사용해야합니다 처음에는 더 이상 유효하지 않습니다. 실제로

get(handles.axes) 

을 입력 한 후이 속성을 'replace'로 설정하면 해당 속성이 자식 대신 전체 축을 대체한다는 것을 알 수 있습니다. 당신은 또한에 플롯 후 축을 감지 findobj 사용할 수있는 전역 변수에 대한 해결 방법으로

handles.axes=axes('OuterPosition',[0.1 0.1 0.8 0.8],... 
        'Tag','axes','NextPlot' ,'ReplaceChildren'); 

을 : 따라서 코드는 다음과 같을 것이다

function plotter 

hAx = findobj('Type','axes') 
handles=guihandles; 
plot([0 1],[0 str2num(get(handles.edit,'String'))],'parent',hAx); 

를하지만, 경우에 매우 편리 아니다 하나 이상의 축이 있습니다.

GUI에서 전역 변수를 사용하면 코드를 쉽게 구현할 수 있습니다. 그러나 내가 알고있는 한 가지주의 사항은 GUI에서 독립형 응용 프로그램을 배포하려는 경우 컴파일 및 실행 중에 많은 오류가 발생한다는 것입니다. 당신은 그것들을 제거해야 할 것입니다.

위 코드를 사용해도 아무 문제가 없습니다. 희망이 도움이됩니다!

+0

+1 빠른 연구와 답을 얻으려면! 내 의견에 쓴 내용이 더 일반적이라고 생각합니다.이 방법으로도 문제가 해결되는지 알려주시겠습니까? – Adiel

+0

upvote에 감사드립니다! 그리고 내가 언급 한 선을 추가하면 축이 인식되지 않습니다. 초기화시 NextPlot 속성을 변경하지 않는 한 –

+0

이상한 ... 어쩌면 그는 또한 그림을 정의해야한다 .- handles.figure; handles.axes; 나는 지금 matlab을 가지고 있지 않지만, 나는 그것으로 스스로 놀고 정의를 확인하기 위해 curiouse를 가지고있다. 나는이 재산에 대해 몰랐다. – Adiel

3

guidata()와 같지 않은 그림의 실제 핸들 목록을 제공하는 guihandles() 함수를 잘못 이해했다고 생각합니다. 실제로 handle.axes의 이름을 handles.axes1로 바꾸면 첫 번째 콜백에서 실패하는 것을 볼 수 있습니다.

이 코드는 guidata()를 사용하여 데이터를 저장하고 검색합니다 (줄 끝의 주석).

function GuiHandleShare1 

handles.figure=figure; 

handles.edit=uicontrol('Style','Edit',... 
         'Position',[5 5 50 20],... 
         'Callback',@edit_callback,... 
         'Tag','edit'); 
handles.slider=uicontrol('Style','Slider',... 
         'Position',[55 5 500 20],... 
         'Callback',@slider_callback,... 
         'Tag','slider'); 
handles.axes1=axes('OuterPosition',[0.1 0.1 0.8 0.8],... 
        'Tag','axes'); 
guidata(handles.figure, handles); % save handles to GUIDATA 

function plotter 
handles=guidata(gcf); % retrieve handles from GUIDATA 
plot(handles.axes1,[0 1],[0 str2num(get(handles.edit,'String'))]) 

function edit_callback(h,eventdata) 
handles=guidata(gcf); 
set(handles.slider,'Value',str2num(get(handles.edit,'String'))); 
plotter 

function slider_callback(h,eventdata) 
handles=guidata(gcf); 
set(handles.edit,'string',num2str(get(handles.slider,'Value'))); 
plotter 
관련 문제