如何强制回调绘图命令转到所需的数字 window?
How to force callback plot commands to go to desired figure window?
我有一个有效的 MATLAB
函数,它根据图中的 GUI 按钮绘制数据 window,包括一个回调,其中 starts/stops 一个循环来绘制类似电影的帧顺序数据。
我想解决的问题是:如何设置两个这样的 windows、运行 不同的数据集,但基于相同的代码(函数、回调等),而不让活动绘图循环跳转到任何一个图 window 恰好有焦点?也就是说,如果我开始一部情节电影,然后点击另一部 window,情节发生在这一秒 window(而且,只有原始 window 中的 GUI 按钮可以影响剧情)。
我所希望的是等价于得到数字 window 的 Figure Number
与,例如 gcbf
,然后将 属性 对添加到我的 imagesc
和 plot
命令以确保将数据发送到所需的 window。我不清楚 Image Property
或 Chart Line Property
会做什么(如果有的话)。
我想做的事情是否可行,如果可以,我是否必须从图中检索 Axes
属性 并使用该 属性 分配我的数据图?我不要求两个地块同时主动更新,但我确实想避免我现在正在处理的交叉 window 地块。
您想在使用 plot
或 imagesc
时明确指定 Parent
属性 以确保在适当的位置创建 object。您可以使用 'Parent'
参数/值对语法或作为第一个输入来执行此操作。
imagesc(data, 'Parent', hfigure)
imagesc(hfigure, data);
我个人更喜欢第一个选项,因为它更明确。
一般来说,您应该始终指定这些 parents 以获得可靠的结果。虽然 gca
和 gcf
可以派上用场,但它们也完全取决于用户碰巧点击的位置以及哪个数字处于活动状态,因此在执行回调期间用户选择的变化可能会改变它们的值并导致意外行为。
您似乎在尝试 运行 同一 GUI 的两个实例。如果是这种情况,那么您应该已经拥有 axes
object 的句柄,因此您应该将它们存储在回调可以访问的地方
handles.hfigure = figure();
handles.haxes = axes('Parent', hfigure);
handles.hbutton = uicontrol('Parent', hfigure, 'Callback', @callback)
% Store all of the handles within the main figure's guidata
guidata(handles.hfigure, handles)
function callback(src, evnt)
% Retrieve the stored handles
handles = guidata(src);
imagesc(rand(10), 'Parent', handles.haxes)
end
或者您可以明确地将它们传递给您的回调
hfigure = figure();
haxes = axes('Parent', hfigure);
hbutton = uicontrol('Parent', hfigure, 'Callback', @(s,e)callback(s, e, haxes));
function callback(src, evnt, haxes)
imagesc(rand(10), 'Parent', haxes)
end
我个人更喜欢第二种方法,因为我完全传递了需要的东西。
旁注
与其在回调中连续调用 plot
和 imagesc
,不如创建 image
或 plot
[=48= 获得更好的性能] 在您的 GUI 的初始化代码中,然后简单地从回调中更新 CData
或 XData
和 YData
属性。
hfigure = figure();
haxes = axes('Parent', hfigure);
himage = imagesc(NaN, 'Parent', haxes);
hbutton = uicontrol('Parent', hfigure, 'Callback', @(s,e)callback(s,e,himage))
function callback(src, evnt, himage)
set(himage, 'CData', rand(10))
drawnow
end
我有一个有效的 MATLAB
函数,它根据图中的 GUI 按钮绘制数据 window,包括一个回调,其中 starts/stops 一个循环来绘制类似电影的帧顺序数据。
我想解决的问题是:如何设置两个这样的 windows、运行 不同的数据集,但基于相同的代码(函数、回调等),而不让活动绘图循环跳转到任何一个图 window 恰好有焦点?也就是说,如果我开始一部情节电影,然后点击另一部 window,情节发生在这一秒 window(而且,只有原始 window 中的 GUI 按钮可以影响剧情)。
我所希望的是等价于得到数字 window 的 Figure Number
与,例如 gcbf
,然后将 属性 对添加到我的 imagesc
和 plot
命令以确保将数据发送到所需的 window。我不清楚 Image Property
或 Chart Line Property
会做什么(如果有的话)。
我想做的事情是否可行,如果可以,我是否必须从图中检索 Axes
属性 并使用该 属性 分配我的数据图?我不要求两个地块同时主动更新,但我确实想避免我现在正在处理的交叉 window 地块。
您想在使用 plot
或 imagesc
时明确指定 Parent
属性 以确保在适当的位置创建 object。您可以使用 'Parent'
参数/值对语法或作为第一个输入来执行此操作。
imagesc(data, 'Parent', hfigure)
imagesc(hfigure, data);
我个人更喜欢第一个选项,因为它更明确。
一般来说,您应该始终指定这些 parents 以获得可靠的结果。虽然 gca
和 gcf
可以派上用场,但它们也完全取决于用户碰巧点击的位置以及哪个数字处于活动状态,因此在执行回调期间用户选择的变化可能会改变它们的值并导致意外行为。
您似乎在尝试 运行 同一 GUI 的两个实例。如果是这种情况,那么您应该已经拥有 axes
object 的句柄,因此您应该将它们存储在回调可以访问的地方
handles.hfigure = figure();
handles.haxes = axes('Parent', hfigure);
handles.hbutton = uicontrol('Parent', hfigure, 'Callback', @callback)
% Store all of the handles within the main figure's guidata
guidata(handles.hfigure, handles)
function callback(src, evnt)
% Retrieve the stored handles
handles = guidata(src);
imagesc(rand(10), 'Parent', handles.haxes)
end
或者您可以明确地将它们传递给您的回调
hfigure = figure();
haxes = axes('Parent', hfigure);
hbutton = uicontrol('Parent', hfigure, 'Callback', @(s,e)callback(s, e, haxes));
function callback(src, evnt, haxes)
imagesc(rand(10), 'Parent', haxes)
end
我个人更喜欢第二种方法,因为我完全传递了需要的东西。
旁注
与其在回调中连续调用 plot
和 imagesc
,不如创建 image
或 plot
[=48= 获得更好的性能] 在您的 GUI 的初始化代码中,然后简单地从回调中更新 CData
或 XData
和 YData
属性。
hfigure = figure();
haxes = axes('Parent', hfigure);
himage = imagesc(NaN, 'Parent', haxes);
hbutton = uicontrol('Parent', hfigure, 'Callback', @(s,e)callback(s,e,himage))
function callback(src, evnt, himage)
set(himage, 'CData', rand(10))
drawnow
end