Callback 如何强制回调绘图命令转到所需的图形窗口?

Callback 如何强制回调绘图命令转到所需的图形窗口?,callback,focus,matlab-figure,Callback,Focus,Matlab Figure,我有一个工作的MATLAB函数,它根据图形窗口中的GUI按钮绘制数据,包括一个回调,它启动/停止一个循环,以绘制序列数据的电影般的帧。 我想解决的问题是:如何设置两个这样的窗口,使用不同的数据集运行,但基于相同的代码(函数、回调等),而不让活动的绘图循环跳转到恰好有焦点的图形窗口?也就是说,如果我启动一个绘图电影,然后单击另一个窗口,绘图将在第二个窗口中进行(并且,只有原始窗口中的GUI按钮才能影响绘图)。 我所希望的是获得图形窗口的图形编号,例如,gcbf,然后向我的imagesc和plot命

我有一个工作的
MATLAB
函数,它根据图形窗口中的GUI按钮绘制数据,包括一个回调,它启动/停止一个循环,以绘制序列数据的电影般的帧。
我想解决的问题是:如何设置两个这样的窗口,使用不同的数据集运行,但基于相同的代码(函数、回调等),而不让活动的绘图循环跳转到恰好有焦点的图形窗口?也就是说,如果我启动一个绘图电影,然后单击另一个窗口,绘图将在第二个窗口中进行(并且,只有原始窗口中的GUI按钮才能影响绘图)。
我所希望的是获得图形窗口的
图形编号
,例如,
gcbf
,然后向我的
imagesc
plot
命令添加属性对,以确保数据发送到所需的窗口。我不清楚什么(如果有的话)
图像属性
图表线属性
可以做到这一点。

我想做的是可能的吗?如果是,我必须从图形中检索
属性,并使用该属性分配数据图吗?我不要求两个绘图同时进行主动更新,但我确实希望避免现在处理的跨窗口绘图

在明确使用
plot
imagesc
时,要指定
Parent
属性,以确保在适当的位置创建对象。您可以使用
'Parent'
参数/值对语法或作为第一个输入来执行此操作

imagesc(data, 'Parent', hfigure)
imagesc(hfigure, data);
就我个人而言,我更喜欢第一个选项,因为它更明确

通常,您应该始终指定这些父级以获得可靠的结果。虽然
gca
gcf
很方便,但它们也完全取决于用户单击的位置以及哪个图形处于活动状态,因此在执行回调期间更改用户选择可能会更改其值并导致意外行为

看起来您正在尝试运行同一GUI的两个实例。如果是这种情况,那么您应该已经拥有
轴的句柄
对象,因此您应该将它们存储在回调可以访问的位置

handles.hfigure=figure();
handles.haxes=axes('Parent',hfigure);
handles.hbutton=uicontrol('Parent',hfigure',Callback',@Callback)
%将所有句柄存储在主图形的GUI数据中
guidata(handles.hfigure,handles)
函数回调(src、evnt)
%检索存储的句柄
handles=guidata(src);
imagesc(rand(10),“父对象”,handles.haxes)
结束
或者您可以显式地将它们传递给回调

hfigure=figure();
haxes=轴('父',hfigure);
hbutton=uicontrol('Parent',hfigure',Callback',@(s,e)Callback(s,e,haxes));
函数回调(src、evnt、haxes)
imagesc(兰特(10),“母公司”,哈克斯)
结束
我个人更喜欢第二种方法,因为我会传递所需的信息

旁注

而不是从回调中连续调用
plot
imagesc
,在GUI的初始化代码中创建
图像
绘图
对象,然后从回调中简单地更新
CData
扩展数据
YData
属性,将获得更好的性能

hfigure=figure();
haxes=轴('父',hfigure);
himage=imagesc(NaN,‘父’,haxes);
hbutton=uicontrol('Parent',hfigure',Callback',@(s,e)Callback(s,e,himage))
函数回调(src、evnt、himage)
套装(himage,'CData',兰特(10))
刷新屏幕
结束

打印命令应始终指定要打印到的轴对象的控制柄。基于这个确切的原因,依靠
gcf
gca
或类似的命令不是一个好主意。特别感谢您的优化建议。我将实现它,并处理传递代码并报告结果