Как отобразить окно рисунка matplotlib поверх всех других окон в Spyder

Я использую Spyder IDE и обнаружил, что окна фигурок matplotlib всегда отображаются за другими окнами. Например, сразу после запуска Spyder, если я наберу в консоли plt.plot([0,1],[0,1]), я получу график за главным окном Spyder. Как я могу сделать так, чтобы новые окна фигур отображались поверх всех остальных окон?

Я нашел это решение (сделать всплывающее окно графика matplotlib как активный), но у меня он не работает в Spyder. У меня проблемы с fig.canvas.manager.window. Там написано AttributeError: 'FigureManagerMac' object has no attribute 'window'.


person Stretch    schedule 16.11.2013    source источник
comment
Была такая же проблема. Вот решение: stackoverflow.com/a/32934536/5406821   -  person DomenR    schedule 04.10.2015
comment
Похоже, вам нужно настроить SpyderPrefs на использование Qt4Agg или какого-либо другого бэкэнда, отличного от MacOS, для matplotlib. Работает для меня после этого.   -  person Demis    schedule 25.05.2016


Ответы (1)


Ну, я наткнулся на решение, когда работал над чем-то другим.

Когда я использую бэкэнд MacOSX, то fig.canvas.manager.window дает AttributeError: 'FigureManagerMac' object has no attribute 'window'. Однако, когда я использую бэкенд TkAgg, fig.canvas.manager имеет атрибут window. Таким образом, я могу реализовать это предложение следующим образом:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([0,1],[0,1])
#Put figure window on top of all other windows
fig.canvas.manager.window.attributes('-topmost', 1)
#After placing figure window on top, allow other windows to be on top of it later
fig.canvas.manager.window.attributes('-topmost', 0)

Достаточно просто, не так ли? Первая сложная часть заключается в том, что вы должны установить серверную часть, прежде чем импортировать pyplot. По моему опыту, изменение бэкэнда впоследствии ничего не дает. Вторая сложная часть заключается в том, что сценарий запуска Spyder Scientific Startup делает import matplotlib.pyplot as plt правильно, когда вы запускаете Spyder IDE, поэтому у вас нет возможности установить серверную часть до того, как pyplot будет импортирован. Чтобы обойти это, перейдите в «Настройки» -> «Консоль» -> «Внешние модули», установите для GUI Backend значение TkAgg и перезапустите Spyder. Тогда приведенный выше код работает правильно.

Раньше я устанавливал бэкэнд через matplotlib.rcParams['backend'] = 'TkAgg' сразу после запуска Spyder. Однако, когда я делал что-то еще, я начал получать ошибки, в которых упоминался бэкэнд MacOSX. Это не имело для меня никакого смысла, так как я думал, что использую TkAgg. Самое ужасное, что когда я запросил matplotlib.get_backend, он вернул TkAgg! По-видимому, установка бэкэнда после импорта pyplot действует так, как если бы вы изменили бэкэнд, но на самом деле это не меняет бэкэнд. Аргг!!

person Stretch    schedule 17.11.2013
comment
(Spyder dev здесь) Я рад, что вы сами поняли, как решить вашу проблему. У меня есть несколько слов о matplotlib бэкэндах: на Mac мы решили установить его на MacOSX независимо от предпочтений пользователя, потому что он самый надежный, но, учитывая ваше замешательство, я думаю, нам нужно пересмотреть это решение. Я сделаю это для нашего предстоящего релиза 2.3 :) - person Carlos Cordoba; 20.11.2013