我有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"
的{{1}}为在程序的"popup menu"
之后被称为?或者有更好的方法来实现我的目标吗?
答案 0 :(得分:2)
好吧,我现在明白你想要达到的目标,不过我不确定我是否理解这个问题,希望这会有所帮助:
从描述来看,这似乎是事情发生的逻辑顺序:
1:初始化,只需初始化所有内容,您已经知道您将有一个下拉菜单,但您还不知道内容。因此,只需从defaultoption开始或为空(可能不可见)。
2:更新,用户保存新输入后立即更新列表。
答案 1 :(得分:2)
<强>背景强>
可能有用的一些事情:
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