Matlab图形用户界面:动态更改弹出菜单

4

我有一个GUI,想要给它添加一个弹出菜单。应该显示的弹出菜单字段保存在文件targets.txt中。

当我打开程序时,我希望弹出菜单包括上述文件中的行。我这样做是因为我想在程序中动态更改弹出菜单。由于它将包括用户在另一个字段中输入的目录路径,所以我将目录路径保存在文件中,每次用户进入一个文件夹时,我根据该文件设置弹出菜单。(我已经这样做了,它运行得很好)

function myFunction_OpeningFcn(hObject, eventdata, handles, varargin)仅在调用"create function"每个组件的函数之后才被调用,所以我无法在程序的"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): 我将弹出菜单对象保存在handles中,以便在打开函数中使用它。

然后,在打开函数中,我可以执行以下操作:

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

因此,当有人在程序中添加新的“ database”文件夹时,弹出菜单会更改(我将用户选择的文件夹添加到文件中,然后设置弹出菜单从文件中获取其字段(上面的函数)。因此它看起来像这样:
程序在用户输入两个文件夹后的样子
我不喜欢我的代码设计,并且我无法想出其他方法,是否有一种方法可以使“ popup菜单”的“ create function”在程序的“ opening function”之后被调用?还是有更好的方法来实现我的目标?

2
也许只是我自己的问题,但我在这个问题中有点迷失。你能否在问题的顶部总结一下你想要问什么? - Dennis Jaheruddin
1
@DennisJaheruddin 我已经编辑过了,希望现在更清晰明了。 - Maroun
2个回答

2
好的,我现在明白你想要实现什么了,虽然我不确定是否理解了问题,但希望这可以帮到你:
从描述来看,以下是事情发生的逻辑顺序:
1:初始化,只需初始化所有内容,您已经知道将拥有一个下拉菜单,但尚不知道内容。因此,只需从默认选项或空白开始(可能是隐藏的)。
2:更新,一旦用户保存新输入,您就会更新列表。

我不能使用默认的空菜单开始,因为我希望上一次运行时用户输入的先前文件夹被保存(这就是为什么我使用文件来保存数据)。因此,即使您关闭并重新打开程序,列表也会得到更新(它可以工作,但我需要更好的方法来实现它)。 - Maroun
@MarounMaroun,“更好”是指哪方面? - jerad
从设计的角度来看,我认为可以用“更易读”的方式来完成。 - Maroun

2

背景

以下是一些可能有用的信息:

  • 您可以在GUI中定义所需的其他函数;您不限于定义回调函数。
  • 标记图形元素使它们易于从任何回调中找到。
  • gcbf 返回当前回调图形。
  • union 可以返回字符串单元数组的并集。

建议

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接