禁止Matlab窗口抢占焦点

51
有没有办法告诉Matlab 不要在图形命令(如figureplot)时窃取窗口焦点(从外部编辑器,如Emacs),这样可以显著提高我的生产率,因为我经常需要在数据(重新)处理期间继续代码开发。

14
非常好的问题。这真的很烦人。 - Oli
2个回答

43

有可能,诀窍在于不使用“figure”语句,而是直接更改当前图形。这将更改活动绘图而不改变焦点。通常我会这样做:

function change_current_figure(h)
set(0,'CurrentFigure',h)

然后,所有的figure(h)语句都需要改为change_curent_figure(h)。

请注意,这包含在matlab文档中。

需要注意的是,这仅适用于已经创建的图形。如果要定期创建新的图形,则可以将创建图形作为代码的前几行保存句柄,进行处理,然后绘制到它们上面。此示例将起作用。请注意,drawnow命令将刷新事件缓冲区,确保所有图形都被绘制。

我见过这个工作从2007年到2010年,不确定最新或早期版本是否支持此功能,尽管我没有理由怀疑他们不支持。

fig1=figure;
fig2=figure;
drawnow;
[a b]=do_complex_processing;
change_current_figure(fig1)
plot(a);
change_current_figure(fig2)
plot(b);

1
太好了!是否存在不需要这种行为的情况? - Nordlöw
2
虽然plot()窃取了窗口焦点并提升了图形窗口,但这并没有帮助太多。我们也可以防止这种情况发生吗?我正在使用Ubuntu 11.10。 - Nordlöw
1
@Nordlow:我会编辑我的回答,但是有一些技巧可以管理它。我列出的技巧只适用于已经创建的图形。新的图形总是要去前台。 - PearsonArtPhoto
1
这对于imagesc命令也适用吗?对我来说似乎有点棘手。 - Vesnog
在文件交换中有一个脚本可以解决这个问题:让我工作,图形! - Brett
1
现代MATLAB会使用set(groot,'CurrentFigure',h)groot是图形系统根的句柄对象(即句柄编号0)。 - Cris Luengo

4

我有同样的问题,但额外复杂的是创建图形的代码来自外部供应商,我不想修改它。这里有两个可能性(在MathWorks支持的帮助下确定),经过Matlab 2014b测试:

1. 在不显示图形的情况下生成图形,然后在代码完成后显示它们

set(0, 'DefaultFigureVisible', 'off');

for i = 1:10
    fprintf('i: %g\n', i)
    figure;
    pause(1);
end

set(0, 'DefaultFigureVisible', 'on');
figHandles = findall(0, 'Type', 'figure');
set(figHandles(:), 'visible', 'on')

这段代码确实实现了所需功能,但不方便的是你无法查看代码运行的进度,因此不能在出现问题时中断长时间执行。

2. 将图表停靠

  1. Create a new figure:

    figure
    
  2. Dock it:

    enter image description here

    This will put the figure into the Matlab IDE window.

  3. Make new figures docked and run the code:

    set(0, 'DefaultFigureWindowStyle', 'docked');
    
    for i = 1:10
        fprintf('i: %g\n', i)
        figure;
        pause(1);
    end
    
    set(0, 'DefaultFigureWindowStyle', 'normal');
    

我猜2对你有用。我已经实现了它,但整个Matlab窗口仍然会弹出并且抢占焦点... - Brett
@bizzy,你用的是哪个Matlab版本?正如我所写的,我是用Matlab 2014b测试过的。 - texnic
1
@bizzy,抱歉,无法对该版本进行评论。请考虑向Mathworks支持组提问,并在此处发布结果。 - texnic
1
在2016a中,set(0,'DefaultFigureVisible','off')无效。 - John
你可以使用figure('Visible','off')创建不可见的图形,而不是设置默认的图形可见性。 - Cris Luengo
@john: set(0,'DefaultFigureVisible','off') 在 R2019a 版本可行。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接