我有一个Matlab GUI代码,可让您在轴上绘制并将坐标传递给Simulink中的常量。当按住鼠标按钮时,它应该在轴上绘制并发送坐标,当它没有时,它应该发送坐标但不应该绘制。这是代码: `
function figure1_WindowButtonUpFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global bool;
bool=false;
set(handles.figure1,'WindowButtonMotionFcn',@(hObject,eventdata)figure1_WindowButtonMotionFcn(hObject,eventdata,guidata(hObject)));
%set the WindownButtonMotionFcn back in order to make it work again
function figure1_WindowButtonDownFcn(hObject, eventdata, handles)
set(handles.figure1,'WindowButtonMotionFcn',@empty); %change the windowbuttonmotionfcn in order not to let it work
global bool;
bool=true;
global lastX;
global lastY;
x=0;
while bool
coord=get(handles.axes4,'CurrentPoint');
if coord(1)<0.003
coord(1)=0.003
x=0;
end
if coord(1)>1
coord(1)=1
x=0;
end
if coord(3)<0
coord(3)=0
x=0;
end
if coord(3)>0.95
coord(3)=0.95
x=0;
end
if x>1
arrayX=[lastX coord(1)];
arrayY=[lastY coord(3)];
line(arrayX,arrayY);
set_param('dosya_yukle_deneme/Constant','value',num2str(coord(1)));
end
x=x+1;
lastX=coord(1);
lastY=coord(3);
drawnow;
end
function empty(~,~,~)
% --- Executes on mouse motion over figure - except title and menu.
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
coord=get(handles.axes4,'CurrentPoint');
set_param('dosya_yukle_deneme/Constant','value',num2str(coord(1)));
按下鼠标按钮时,它会绘制线条但set_param函数不起作用。但是,在需要时,figure1_WindowButtonMotionFcn中的那个可以很好地工作。似乎问题是while循环。任何帮助将不胜感激。
答案 0 :(得分:3)
您无法在while
回调中运行figure1_WindowButtonDownFcn
循环,因为Matlab GUI是单线程的。这意味着while
循环阻止了Matlab GUI并阻止了正确更新。您需要让回调返回,以便Matlab能够更新GUI。这是Matlab中GUI回调的一般规则;无论你在回调中做什么都会阻止GUI。
事实上,您根本不需要while
循环,因为每次光标更改时WindowButtonMotionFcn
都会回调。您将循环中的代码放入figure1_WindowButtonMotionFcn
回调中。您还需要一个额外的全局标记,指示按钮是否已关闭,但这很容易创建。 figure1_WindowButtonDownFcn
应设置按钮按下标志,figure1_WindowButtonUpFcn
重置按钮按下标志。然后figure1_WindowButtonMotionFcn
检查按钮按下标志是否已设置,如果是,则执行while
循环内的代码。
答案 1 :(得分:1)
我解决了这个问题!所以我发现代码从一开始就在运行。我已经将常量连接到显示器,而figure1_WindowButtonMotionFcn正在工作,它显示了值,但没有显示另一个正在工作。它似乎是MATLAB UI中的一个错误;当检测到鼠标按钮时,显示器不会自动更新。