如何通过 GUI 将项目添加到列表框

How to add items to a listbox via GUI

我拼命地尝试为我的 GUI 创建一个日志框。 我想做的是一开始,在按下 PUSH 按钮后在列表中写入文本。 PUSH Button的回调函数为:

function run__Callback(hObject, eventdata, handles)

   initial_name=cellstr(get(handles.logbox1,'String'))
    handles.names={'test','haus', 'top', 'down', 'optimistic'}
    handles.names{end,end}=[]                                   %Add Element for new text 
    handles.names{end,end}='neuuu'                              %Add Element
    num_element=length(handles.names)                           %Count Elements
    set(handles.logbox1,'String',handles.names)                 %Aktualisiere Liste

    set(handles.logbox1,'Top',num_element)                      %Set Listbox to the last Element

和列表框在同一个 GUI 中。尽管如此,还是有错误:

使用 hg 时出错。uicontrol/set

The name 'Top' is not an accessible property for an instance of class 'uicontrol'.

谁能帮帮我,我不明白怎么了?

此致,约翰

您收到错误是因为 Top 不是 listbox uicontrolproperty;此外,Top 不是任何 uicontrol.

的 属性

你可以找到here the list of uicontrol properties.

最接近"Top"的列表框属性是ListboxTop

我创建了两个简单的 GUI,可以帮助您管理对列表框的访问。

主 GUI "add_to_listbox" 包含:

  • 一个 listboxtag listbox1
  • a pushbutton with tag pushbutton1, String "Add Action": 每次用户按下时,在上面添加一个字符串如"Main GUI: Inserted string #x"列表框的("x" 是一个conter)
  • a pushbutton with tag "open_subgui", String "Open SubGUI" 打开第二个GUI

SubGUI ("add_to_listbox_subgui") 包含

  • a pushbutton with tag pushbutton1, String "Add Action on Main GUI": 每次用户按下时,在上面添加一个字符串如"SUB GUI Inserted string #x"主 GUI 列表框的("x" 是一个控件)

SubGUI 通过使用存储在主 GUI guidata 中的主 GUI listbox handle 处理向主 GUI 列表框添加字符串(当主 GUI 打开 SubGUI 时,它接收主 GUI 的 handle 作为输入;SubGUI 通过它访问主 GUI guidata).

在下面你可以找到:

  • 主 GUI OpeningFcn 其中 "action counter" 已初始化
  • 每次按下 pushbutton 时在列表框中添加一个字符串的主 GUI pushbutton1_Callback
  • 主 GUI open_subgui_Callback 打开 SubGUI
  • SubGUI OpeningFcn,其中处理了 SubGUI 和 Main GUI guidata
  • SubGUI pushbutton1_Callback 每次按下 pushbutton 时都会在主 GUI 列表框中添加一个字符串

主 GUI OpeningFcn

% --- Executes just before add_to_listbox is made visible.
function add_to_listbox_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to add_to_listbox (see VARARGIN)

% Choose default command line output for add_to_listbox
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes add_to_listbox wait for user response (see UIRESUME)
% uiwait(handles.figure1);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Get Main GUI guidata
gui_data=guidata(gcf);
% Add (and initialize) button action counter to Main GUI guidata
gui_data.btn_action=0;
% Set Main GUI guidata
guidata(gcf,gui_data);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%

主 GUI pushbutton1_Callback

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Add button action (from Main GUI) string to the listbox
%
% Get Mani GUI guidata
gui_data=guidata(gcf);
% Increment button action counter
gui_data.btn_action=gui_data.btn_action+1;
% Set Main GUI guidata (to store button action counter)
guidata(gcf,gui_data);
% Generate action string and add it to the listbox
% The firt strimg is directly add to the listbox
if(gui_data.btn_action == 1)
   new_str='Main GUI: Inserted string #1';
   set(handles.listbox1,'string',new_str);
else
   new_str=['Main GUI: Inserted string #' num2str(gui_data.btn_action)];
   % The fisrt string in the list box is returned as "string", to add the
   % second one, it has has to be first converted into a cellarray
   if(gui_data.btn_action == 2)
      tmp_str=cellstr(get(handles.listbox1,'string'));
   else
      % The order of the string in the listbox is reversed to have the last
      % one on top
      tmp_str=flipud(get(handles.listbox1,'string'));
   end
   % Set the updated set of seting to the listbox
   tmp_str{end+1,1}=new_str;
   set(handles.listbox1,'string',flipud(tmp_str));
end

主 GUI open_subgui_Callback

% --- Executes on button press in open_subgui.
function open_subgui_Callback(hObject, eventdata, handles)
% hObject    handle to open_subgui (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Open the Sub GUI; the handle of the Main GUI is passed as argument to
% This allows Sub GUI accessing to the Main GUI guidata
add_to_listbox_subgui(gcf)
% Disable the "Open Sub GUI" button
set(handles.open_subgui,'enable','off')

SubGUI OpeningFcn

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Add Sub GUI button action string to Main GUI listbox
%
% Get Sub GUI guidata
gui_data=guidata(gcf);
% Get Main GUI guidata, "gui_data.main_gui" holds the Main GUI handle
gui_data.main_gui_data=guidata(gui_data.main_gui);
% Increment the button action counter
gui_data.btn_action=gui_data.main_gui_data.btn_action+1;
% Update Main GUI button actin counter
main_gui_data=guidata(gui_data.main_gui);
main_gui_data.btn_action=gui_data.btn_action;
% Store Sub GUI guidata
guidata(gcf,gui_data);
% Store Main GUI guidata
guidata(gui_data.main_gui,main_gui_data);
%
% Add button action (from Main GUI) string to the listbox
%
if(gui_data.btn_action == 1)
   % Generate action string and add it to the Main GUI listbox
   % The firt strimg is directly add to the listbox
   new_str='SUB GUI Inserted string #1';
   set(gui_data.listbox,'string',new_str);
else
   new_str=['SUB GUI Inserted string #' num2str(gui_data.btn_action)];
   % The fisrt string in the list box is returned as "string", to add the
   % second one, it has has to be first converted into a cellarray
   if(gui_data.btn_action == 2)
      tmp_str=cellstr(get(gui_data.listbox,'string'));
   else
      % The order of the string in the listbox is reversed to have the last
      % one on top
      tmp_str=flipud(get(gui_data.listbox,'string'));
   end
   % Set the updated set of seting to the listbox
   tmp_str{end+1,1}=new_str;
   set(gui_data.listbox,'string',flipud(tmp_str));
end

希望对您有所帮助。