Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 在MatlabGUI中更新listbox并在函数末尾将变量更改为旧值_User Interface_Matlab - Fatal编程技术网

User interface 在MatlabGUI中更新listbox并在函数末尾将变量更改为旧值

User interface 在MatlabGUI中更新listbox并在函数末尾将变量更改为旧值,user-interface,matlab,User Interface,Matlab,下面的GUI只是列出列表框中的一些数据,绘制它,并为用户提供从列表框中删除条目的选项。在用户删除一个条目后,我试图正确地更新listbox(当您运行它时,这应该是显而易见的),我的头撞到了墙上 我遇到的两个问题是: 虽然对按钮的回调确实正确地从数组x中删除了条目,但一旦回调完成,数组x将恢复为原始的x数组(因此,该值以某种方式自行恢复) 我尝试使用“drawnow”刷新列表框以反映当前的x数组(该数组已被修改,至少在下面发布drawnow的地方)。但一切都没有改变。如何使用新的x数组值刷新列表框

下面的GUI只是列出列表框中的一些数据,绘制它,并为用户提供从列表框中删除条目的选项。在用户删除一个条目后,我试图正确地更新listbox(当您运行它时,这应该是显而易见的),我的头撞到了墙上

我遇到的两个问题是:

  • 虽然对按钮的回调确实正确地从数组x中删除了条目,但一旦回调完成,数组x将恢复为原始的x数组(因此,该值以某种方式自行恢复)

  • 我尝试使用“drawnow”刷新列表框以反映当前的x数组(该数组已被修改,至少在下面发布drawnow的地方)。但一切都没有改变。如何使用新的x数组值刷新列表框

  • ----------------图形用户界面代码---------

    函数测试GUI
    清楚的全部关闭;
    %创建数据
    x=(10:20)';%示例数据
    %塑造形象
    f=图('名称','图形用户界面测试',。。。
    “NumberTitle”、“off”和,。。。
    “菜单栏”、“无”和,。。。
    '单位','像素',。。。
    '位置',[100 100 700 800],。。。
    “可见”、“关闭”);
    %创建一组轴
    a=轴('父',f,。。。
    '单位','像素',。。。
    “位置”[230 50 450 700]);
    %创建用于修改x阵列的按钮
    pb_x=uicontrol('样式','按钮'。。。
    '父',f,。。。
    '字符串','删除所选内容',。。。
    '单位','像素',。。。
    “位置”[50 7 100 35],。。。
    '回调',@pb_change_x);
    绘图(x,'bo');%图表
    xlabel(“索引编号”);ylabel(‘变量x’);
    %创建一个列表框来保存x值
    y=strtrim(cellstr(num2str(x));
    lb=uicontrol('样式','列表框',。。。
    '父',f,。。。
    '字符串',y,。。。
    '单位','像素',。。。
    “位置”[50 100 700],。。。
    '回调',@list_change);
    设置(f,“可见”和“打开”)
    功能列表_更改(varargin)
    %更改列表框中的选择时运行
    curIdx=get(磅,“值”);
    %索引值
    curVal=str2double(cell2mat(y(curIdx));
    %获取曲线在x中的位置
    posVal=find(ismember(x,curVal));
    %清除当前轴上的所有子对象
    删除(获取(a,'Children'))
    %绘制一个感兴趣的数据点
    绘图(posVal、curVal、'bo'、'MarkerFaceColor'、'b'、'MarkerSize',10)
    xlabel(“索引编号”);ylabel(‘变量x’);
    %绘制所有数据
    等等
    图(x,'bo')
    拖延
    结束
    函数pb_change_x(varargin)
    
    %当DUT您已正确识别修复程序时运行。更一般地说,我认为您需要分别更新编码GUI状态的每个项(即GUI独立存储的每个项)

    具体来说,您的实现将绘图中的数据数组“x”和单元格数组“y”分别存储到GUI中,单元格数组中的每个项目都有列表框名称字符串。创建列表框“lb”时,提供了“y”作为“String”属性。此时,列表框将独立于“y”和“x”变量单独存储其自己的“y”副本

    当您更新绘图时,您正在重置GUI的“x”值,但正如您发现的,您还需要更新列表框的“String”属性(其“y”的副本)。在这种情况下,您选择的方式似乎最简单,但更通用的方法是重复从“x”(更新“x”)生成“y”的步骤,然后使用“set(lb,'String',y);”重置GUI的“y”版本


    希望有帮助!:-)

    看来你已经解决了这个问题。尽管如此,我还是改写了您的示例,并尝试将其简化一点:

    function testgui2()
        data = [1:11 ; 10:20]';          %'# data
        handles = [];
    
        %# create GUI
        handles.hFig = figure('Name','GUI Test', 'NumberTitle','off', ...
            'Units','pixels', 'Position',[100 100 700 800], ...
            'MenuBar','none', 'Visible','off');
        handles.hAx = axes('Parent',handles.hFig, ...
            'Units','pixels', 'Position',[230 50 450 700]);
        handles.hPB = uicontrol('Style','pushbutton', 'Parent',handles.hFig, ...
            'String','Delete Selection',...
            'Units','pixels', 'Position',[50 7 100 35],...
            'Callback',@button_callback);
        handles.hLB = uicontrol('Style','listbox', 'Parent',handles.hFig, ...
            'String',data(:,2), 'Value',1, ...
            'Units','pixels', 'Position',[50 50 100 700], ...
            'Callback',@listbox_callback);
        set(handles.hFig, 'Visible','on')
    
        %# plot data and highlighted point
        handles.hPlot = plot(data(:,1), data(:,2), 'bo');
        handles.hLine = line('XData',data(1,1), 'YData',data(1,2), ...
            'Marker','o', 'MarkerSize',10, 'Color','b', 'MarkerFaceColor','b');
        xlabel('Index Number'), ylabel('Variable x')
        set(handles.hAx, 'XLimMode','manual', 'YLimMode','manual')    %# fix limits
    
        %# callback function for button
        function button_callback(varargin)
            %# get current selection
            selected = get(handles.hLB, 'Value');
            if selected==0, return, end
    
            %# remove data point
            data(selected,:) = [];
    
            %# update the listbox
            set(handles.hLB, 'String',data(:,2))
            set(handles.hLB, 'Value',min(selected,size(data,1)))
            %# update plot
            set(handles.hPlot, 'XData',data(:,1), 'YData',data(:,2))
            listbox_callback()
        end
    
        %# callback function for listbox
        function listbox_callback(varargin)
            %# get current selection
            selected = get(handles.hLB, 'Value');
            if selected==0, selected = []; end
    
            %# update plot (highlighted point)
            set(handles.hLine, 'XData',data(selected,1), 'YData',data(selected,2))
        end
    
    end
    

    好的,我想我通过添加set(lb,'String',x)修复了它;到回调,而不是现在提取。
    function testgui2()
        data = [1:11 ; 10:20]';          %'# data
        handles = [];
    
        %# create GUI
        handles.hFig = figure('Name','GUI Test', 'NumberTitle','off', ...
            'Units','pixels', 'Position',[100 100 700 800], ...
            'MenuBar','none', 'Visible','off');
        handles.hAx = axes('Parent',handles.hFig, ...
            'Units','pixels', 'Position',[230 50 450 700]);
        handles.hPB = uicontrol('Style','pushbutton', 'Parent',handles.hFig, ...
            'String','Delete Selection',...
            'Units','pixels', 'Position',[50 7 100 35],...
            'Callback',@button_callback);
        handles.hLB = uicontrol('Style','listbox', 'Parent',handles.hFig, ...
            'String',data(:,2), 'Value',1, ...
            'Units','pixels', 'Position',[50 50 100 700], ...
            'Callback',@listbox_callback);
        set(handles.hFig, 'Visible','on')
    
        %# plot data and highlighted point
        handles.hPlot = plot(data(:,1), data(:,2), 'bo');
        handles.hLine = line('XData',data(1,1), 'YData',data(1,2), ...
            'Marker','o', 'MarkerSize',10, 'Color','b', 'MarkerFaceColor','b');
        xlabel('Index Number'), ylabel('Variable x')
        set(handles.hAx, 'XLimMode','manual', 'YLimMode','manual')    %# fix limits
    
        %# callback function for button
        function button_callback(varargin)
            %# get current selection
            selected = get(handles.hLB, 'Value');
            if selected==0, return, end
    
            %# remove data point
            data(selected,:) = [];
    
            %# update the listbox
            set(handles.hLB, 'String',data(:,2))
            set(handles.hLB, 'Value',min(selected,size(data,1)))
            %# update plot
            set(handles.hPlot, 'XData',data(:,1), 'YData',data(:,2))
            listbox_callback()
        end
    
        %# callback function for listbox
        function listbox_callback(varargin)
            %# get current selection
            selected = get(handles.hLB, 'Value');
            if selected==0, selected = []; end
    
            %# update plot (highlighted point)
            set(handles.hLine, 'XData',data(selected,1), 'YData',data(selected,2))
        end
    
    end