Запрет кражи фокуса окна Matlab

39

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

  • 12
    ОЧЕНЬ хороший вопрос Это так раздражает.
Теги:
focus
plot

2 ответа

36
Лучший ответ

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

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

Затем все операторы рисунка (h) необходимо изменить на change_curent_figure (h).

Примечание. Это включено в документацию matlab.

Следует отметить, что это работает только в том случае, если фигура уже создана. Если новые цифры будут периодически создаваться, можно создать цифры как самые первые строки кода, сохранить дескрипторы, обработать, а затем зарисовать их. Этот пример будет работать. Обратите внимание: команда drawow очистит буфер событий, убедившись, что все фигуры нанесены на график.

Я видел эту работу с 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
    Это работает, это волшебство.
  • 1
    Большой! Есть ли случаи, когда вы не хотите такого поведения?
Показать ещё 4 комментария
1

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

  • Создайте новый рисунок:

    figure
    
  • Док-станция:

    Изображение 6326

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

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

    set(0, 'DefaultFigureWindowStyle', 'docked');
    
    for i = 1:10
        fprintf('i: %g\n', i)
        figure;
        pause(1);
    end
    
    set(0, 'DefaultFigureWindowStyle', 'normal');
    
  • 0
    Я полагаю, 2 работы для вас. Я реализовал это, и все окно Matlab все еще всплывает и крадет фокус ...
  • 0
    @bizzy, какую версию Matlab вы используете? Как я уже писал, я протестировал его с Matlab 2014b.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню