4

我有一个GUI我想添加一个popup menupopup 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从文件中获取其字段(上面的函数)。所以它'看起来像这样:

用户进入两个文件夹后的程序

我不喜欢我的代码设计,我不知道如何以不同的方式做到这一点,有没有办法让程序"create function""popup menu"调用?还是有更好的方法来实现我的目标? "opening function"

4

2 回答 2

2

好吧,我现在了解您想要实现的目标,尽管我不确定我是否了解问题,但希望这会有所帮助:

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

1:初始化,只是初始化一切,你已经知道你会有一个下拉菜单但你还不知道内容。因此,只需从默认选项或空(可能不可见)开始。

2:更新,一旦用户保存新输入,您就更新列表。

于 2012-12-14T10:37:00.513 回答
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
于 2012-12-17T22:35:33.833 回答