matlab set_param函数不在循环中工作

时间:2017-07-25 10:07:01

标签: matlab user-interface octave simulink

我有一个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循环。任何帮助将不胜感激。

2 个答案:

答案 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中的一个错误;当检测到鼠标按钮时,显示器不会自动更新。