如何在从其他函数创建后更新 uitable?
How to update a uitable after creation from other functions?
我创建了一个 matfile,其中存储了不断被用户行为覆盖的数据。这发生在函数 "test()".
中
n=1
while n < 5
myVal = double(Test704(1, 780, -1)) %Returns the user's behavior
if myVal == 1
n = n + 1 %"n" is the overwritten variable in the matfile
end
save('testSave1.mat') %The matfile
m = matfile('testSave1.mat')
end
然后,我想在另一个名为"storageTest()"的函数中显示这些数据(必须有两个独立的函数)。更具体地说,storageTest() 是一个 GUI 函数,我在其中开发了一个 uitable "t"。所以,我首先调用函数"test()",并将其输出值作为"t"的数据。这是"storageTest"中有趣部分的代码:
m = test()
d = [m.n]
t = uitable('Data',d, ...
'ColumnWidth',{50}, ...
'Position',[100 100 461 146]);
t.Position(3) = t.Extent(3);
t.Position(4) = t.Extent(4);
drawnow
此代码仅在 "m = test()" 运行 结束时执行,并显示一个选项卡,我可以在其中看到 "n" 的最终值。但是,我希望之前显示我的 table 并看到我的值根据用户的行为增加。
我已经在网上搜索解决我的问题,但我找不到任何答案,是否可以这样做?
假设我正确地解释了这个问题,如果您在调用 test
之前初始化您的 table 然后将句柄传递给您的 table test
在 while
循环中更新:
例如:
function testGUI
% Initialize table
t = uitable('ColumnWidth',{50}, 'Position',[100 100 461 146]);
test(t)
function test(t)
n = 1;
while n < 5
n = n + 1;
t.Data = n;
pause(0.25); % Since we're just incrementing a number, a slight so we can actually see the change
end
当您 运行 执行上述操作时,您会注意到 table 中的数据按预期迭代。
写的和我基本一样的答案要快一点。由于它看起来略有不同,我还是 post 它。
function storagetest()
close all
f = figure;
data = [1];
t = uitable(f,'Data',data,'ColumnWidth',{50});
test()
end
function test()
% handle uitable
t = evalin('caller','t')
n = 1;
while n < 5
newVal = input('Enter a number:');
data = get(t,'Data');
set(t,'Data', [data; newVal]);
n = n + 1;
end
end
我用input
函数模仿的"user behaviour"。基本思想是从 test()
中更新您的 table。 evalin
你可以使用,如果你不想传递参数给 test()
,虽然直接传递 uitable 的句柄肯定是更好的选择。
如果您正在从事严肃的 GUI 项目,我强烈建议您阅读 this answer。
我创建了一个 matfile,其中存储了不断被用户行为覆盖的数据。这发生在函数 "test()".
中n=1
while n < 5
myVal = double(Test704(1, 780, -1)) %Returns the user's behavior
if myVal == 1
n = n + 1 %"n" is the overwritten variable in the matfile
end
save('testSave1.mat') %The matfile
m = matfile('testSave1.mat')
end
然后,我想在另一个名为"storageTest()"的函数中显示这些数据(必须有两个独立的函数)。更具体地说,storageTest() 是一个 GUI 函数,我在其中开发了一个 uitable "t"。所以,我首先调用函数"test()",并将其输出值作为"t"的数据。这是"storageTest"中有趣部分的代码:
m = test()
d = [m.n]
t = uitable('Data',d, ...
'ColumnWidth',{50}, ...
'Position',[100 100 461 146]);
t.Position(3) = t.Extent(3);
t.Position(4) = t.Extent(4);
drawnow
此代码仅在 "m = test()" 运行 结束时执行,并显示一个选项卡,我可以在其中看到 "n" 的最终值。但是,我希望之前显示我的 table 并看到我的值根据用户的行为增加。 我已经在网上搜索解决我的问题,但我找不到任何答案,是否可以这样做?
假设我正确地解释了这个问题,如果您在调用 test
之前初始化您的 table 然后将句柄传递给您的 table test
在 while
循环中更新:
例如:
function testGUI
% Initialize table
t = uitable('ColumnWidth',{50}, 'Position',[100 100 461 146]);
test(t)
function test(t)
n = 1;
while n < 5
n = n + 1;
t.Data = n;
pause(0.25); % Since we're just incrementing a number, a slight so we can actually see the change
end
当您 运行 执行上述操作时,您会注意到 table 中的数据按预期迭代。
function storagetest()
close all
f = figure;
data = [1];
t = uitable(f,'Data',data,'ColumnWidth',{50});
test()
end
function test()
% handle uitable
t = evalin('caller','t')
n = 1;
while n < 5
newVal = input('Enter a number:');
data = get(t,'Data');
set(t,'Data', [data; newVal]);
n = n + 1;
end
end
我用input
函数模仿的"user behaviour"。基本思想是从 test()
中更新您的 table。 evalin
你可以使用,如果你不想传递参数给 test()
,虽然直接传递 uitable 的句柄肯定是更好的选择。
如果您正在从事严肃的 GUI 项目,我强烈建议您阅读 this answer。