Запретить кражу фокуса окна Matlab - PullRequest
47 голосов
/ 13 декабря 2011

Есть ли способ сказать Matlab , а не , чтобы он крал фокус окна (из внешнего редактора), такого как Emacs, на графических командах, таких как figure и plot. Это значительно увеличит мою производительность, потому что я часто хочу продолжать разработку кода во время (пере) обработки данных.

Ответы [ 2 ]

41 голосов
/ 13 декабря 2011

Возможно, уловка состоит не в том, чтобы использовать оператор рисунка, а в том, чтобы напрямую изменить текущий рисунок. Это изменит активный сюжет без изменения фокуса. Обычно я делаю что-то вроде этого:

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);
3 голосов
/ 25 февраля 2016

У меня тот же вопрос, с той дополнительной сложностью, что фигуры, создающие код, пришли от внешнего поставщика, и я не хотел его модифицировать.Вот две возможности (выявленные с помощью поддержки 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. Создайте новую фигуру:

    figure
    
  2. Прикрепите ее:

    enter image description here

    Это поместит фигуру в окно Matlab IDE.

  3. Сделайте новые фигуры закрепленными и запустите код:

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