Matlab GUI:动态更改弹出菜单

时间:2012-12-14 08:31:00

标签: matlab matlab-guide

我有GUI我要为其添加popup menu。 应显示的popup menu字段保存在文件targets.txt中。

当我打开程序时,我希望popup menu包含上述文件中的行。 我这样做是因为我希望 popup menu 在程序中动态更改。由于它将包含用户在另一个字段中输入的目录路径,因此我将目录路径保存在文件中,每次用户输入文件夹时,我都会根据 popup menu 设置到文件。(我做了,它工作正常)

由于function myFunction_OpeningFcn(hObject, eventdata, handles, varargin)仅在调用"create function"的每个组件的GUI后调用,我无法执行此操作程序"opening function"中的初始化。相反,我不得不这样:

function databaseMenu_CreateFcn(hObject, eventdata, handles)
if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end
handles.databaseMenuObject=hObject; % (1) see below
guidata(hObject, handles);

(1):我将弹出菜单对象保存在句柄中,以便我可以在打开功能中使用它。

然后,在开场功能中,我可以做到:

fid_r = fopen('targets.txt', 'r');
C = textscan(fid_r, '%s');
set(handles.databaseMenuObject,'String', C{1});

因此,当有人在程序中添加新的"database"文件夹时,popup menu 会更改(我将用户选择的文件夹添加到文件中,并且然后我将popup menu设置为从文件中获取其字段(上面的函数)。所以它看起来像那样:

The program after the user entered two folders

我不喜欢我的代码的设计,我无法弄清楚如何以不同的方式执行此操作,是否有办法使"create function"的{​​{1}}为在程序的"popup menu" 之后被称为?或者有更好的方法来实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

好吧,我现在明白你想要达到的目标,不过我不确定我是否理解这个问题,希望这会有所帮助:

从描述来看,这似乎是事情发生的逻辑顺序:

1:初始化,只需初始化所有内容,您已经知道您将有一个下拉菜单,但您还不知道内容。因此,只需从defaultoption开始或为空(可能不可见)。

2:更新,用户保存新输入后立即更新列表。

答案 1 :(得分:2)

<强>背景

可能有用的一些事情:

  • 您可以在GUI中根据需要定义其他功能;您不仅限于定义的回调。
  • 标记图元素可以轻松地从任何回调中找到它们。
  • gcbf返回当前的回调数字。
  • union可以返回字符串的单元格数组的并集。

<强>建议

以下是我可以编写这样一个函数的方法。这将所有内容放在一个位置,可以从GUI中的任何位置调用该函数,它会自动更新缓存的列表,并消除任何重复的条目。

您可以在初始化代码的末尾调用此代码,以及添加文件夹的回调。可以通过右键单击并在GUIDE中设置属性来设置标记

updatePopupMenu()
  popupMenuHandle = findobj(gcbf,'Tag','myPopupMenuTag');
  popupMenuContents = get(popupMenuHandle,'String');

  % Initialization
  if isempty(popupMenuContests)
    fid_r = fopen('targets.txt', 'r');
    C = textscan(fid_r, '%s');
    popupMenuContents = C{1};
  end

  % Join
  otherFields = howeverYouGetFieldsFromOtherList();
  combinedContents = union(popupMenuContents, otherFields);

  % Save
  set(popupMenuHandle,'String', combinedContents);
  fid_w = fopen('targets.txt','w+');
  for i = 1:length(combinedContents)
    fprintf(fid_w,'%s\n',combinedContents{i}); 
  end
  fclose(fid_w);
end