Графический интерфейс Matlab: динамическое изменение всплывающего меню

У меня есть 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, чтобы его поле было из файл (функция выше). Таким образом, это будет выглядеть так:

Программа после входа пользователя в две папки

Мне не нравится дизайн моего кода, и я не мог понять, как сделать это по-другому, есть ли способ сделать так, чтобы "create function" из "popup menu" вызывалось после "opening function" программы? Или есть лучший способ достичь моей цели?


person Maroun    schedule 14.12.2012    source источник
comment
Возможно, это только я, но я немного теряюсь в этом вопросе. Не могли бы вы обобщить то, что вы хотите задать в верхней части вопроса?   -  person Dennis Jaheruddin    schedule 14.12.2012
comment
@DennisJaheruddin Я отредактировал его, надеюсь, теперь он более понятен.   -  person Maroun    schedule 14.12.2012


Ответы (2)


Фон

Несколько вещей, которые могут быть полезны:

  • При необходимости вы можете определить дополнительные функции в графическом интерфейсе; вы не ограничены определенными обратными вызовами.
  • Пометка элементов фигуры позволяет легко найти их из любого обратного вызова.
  • gcbf возвращает текущую цифру обратного вызова.
  • union может возвращать объединение массивов ячеек строк.

Предложения

Вот как я мог бы написать такую ​​функцию. Это помещает все в одном месте, функция может быть вызвана из любого места в вашем графическом интерфейсе, она автоматически обновляет кэшированный список и устраняет любые повторяющиеся записи.

Вы должны вызвать этот код в конце вашего кода инициализации, а также обратный вызов для добавления папок. Тег можно установить, щелкнув правой кнопкой мыши и установив свойства в 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
person supyo    schedule 17.12.2012

Хорошо, теперь я понимаю, чего вы хотите достичь, хотя я не уверен, понимаю ли я проблему. Надеюсь, это поможет:

Судя по описанию, это кажется логичным порядком событий:

1: Инициализация, просто инициализируйте все, вы уже знаете, что у вас будет выпадающее меню, но вы просто еще не знаете его содержимое. Поэтому просто начните с опции по умолчанию или пустой (возможно, невидимой).

2: Обновить. Как только пользователи сохранят новый ввод, вы обновите список.

person Dennis Jaheruddin    schedule 14.12.2012
comment
Я не могу начать с пустого меню по умолчанию, потому что я хочу, чтобы предыдущие папки, введенные пользователем в предыдущем запуске, сохранялись (поэтому я использую файл для сохранения данных). Таким образом, список обновляется, даже когда вы закрываете и снова открываете программа (она работает, мне просто нужен лучший способ сделать это) - person Maroun; 14.12.2012
comment
@MarounMaroun, в каком смысле лучше? - person jerad; 14.12.2012
comment
В смысле оформления, думаю можно сделать более читабельно - person Maroun; 15.12.2012