Сделать всплывающее окно с графикой matplotlib активным
Я работаю с Python и Matplotlib на Mac OS X. Когда я работаю над множеством разных окон и мне нужно запустить скрипт, который создает график, окно графика всегда открыто за активным окном и очень разочаровывает необходимость переключаться между окнами для просмотра изображения. Есть ли какая-то причина, по которой нужно определить местоположение окна графика и / или открыть его в качестве окна переднего плана?
Спасибо
10 ответов
Меня беспокоила точно такая же проблема. Наконец-то я нашел решение (в режиме pylab с бэкэндом qt4agg):
get_current_fig_manager().window.raise_()
или же
fig = gcf()
fig.canvas.manager.window.raise_()
С уважением, Маркус
Для меня (OSX 10.10.2, Matplotlib 1.4.3) то, что работает, это изменение бэкэнда matplotlib на TkAgg. Прежде чем импортировать pyplot или что-то еще, перейдите:
import matplotlib
matplotlib.use('TkAgg')
Окна графиков теперь всплывают и могут быть доступны с помощью Command-Tab.
Я обнаружил, что это решение было так часто необходимо (например, при использовании Spyder IDE), я обернул его в функцию.
def show_plot(figure_id=None):
if figure_id is None:
fig = plt.gcf()
else:
# do this even if figure_id == 0
fig = plt.figure(num=figure_id)
plt.show()
plt.pause(1e-9)
fig.canvas.manager.window.activateWindow()
fig.canvas.manager.window.raise_()
В этой теме я нашел хороший ответ: как заставить окно Tkinter переместиться вперед?
По сути, идея состоит в том, чтобы использовать атрибуты окна - установите для атрибута -topmost значение True (1), чтобы окно вышло на передний план, а затем установите для него значение False (0), чтобы позднее оно позволяло другим окнам появляться в перед этим. Вот код, который работал для меня:
import matplotlib.pyplot as plt
wm = plt.get_current_fig_manager()
wm.window.attributes('-topmost', 1)
wm.window.attributes('-topmost', 0)
Для MacOS Sierra и Python 3.6, Matplotlib 2.0.0
get_current_fig_manager().show()
вышеприведенная строка делает работу больше всего на свете.
У меня работают только следующие (с бэкэндом TkAgg):
plt.gcf().canvas.get_tk_widget().focus_force()
Это сработало для меня!
(Проверено на Mac OS X 10.11, Spyder 2.3.5.2 - Python 3.4)
Перейдите в "Настройки"> "Консоль IPython"> "Графика" и установите для бэкэнда Qt (после этого вам нужно перезапустить ядро).
Создайте файл, который содержит:
def raise_window(figname=None):
if figname: plt.figure(figname)
cfm = plt.get_current_fig_manager()
cfm.window.activateWindow()
cfm.window.raise_()
и импортировать его при запуске ("Настройки"> "Консоль IPython"> "Запуск"> "Запустить файл"). Теперь просто вызовите функцию raise_window()
ниже вашего кода.
Пример:
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.figure()
plt.plot(X, C)
plt.plot(X, S)
raise_window()
Вы можете установить
backend : MacOSX
в вашем matplotlibrc
файл для постоянного решения.
У меня работает на macos mojave, с matplotlib 2.1.2. Тем не менее, другие пользователи жаловались, что он не работает для них, поэтому на него могут повлиять другие настройки.
Следующее работало на ноутбуке Jupyter с бэкэндом Qt5 в Windows. Я тестировал его с Python 3.7, matplotlib 3.2.1.
%matplotlib qt5
import matplotlib.pyplot as plt
import numpy as np
from PyQt5 import QtCore
plt.plot(np.linspace(0,1))
window = plt.get_current_fig_manager().window
window.setWindowFlags(window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
plt.show()
window.setWindowFlags(window.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
plt.show()
Начиная с matplotlib 1.5.1 в MacOSX 10.11.6, если вы запускаете оболочку iPython (5.0.0, Python: 3.5.2) и используете%matplotlib, вы можете вывести график matplotlib на передний план, используя:
>>> %matplotlib
Using matplotlib backend: MacOSX
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,3,2,4])
>>> plt.show()
** Редактировать: совет не использовать%pylab, поскольку он загрязняет глобальное пространство имен **
.. оболочка и использование %pylab
Вы можете вывести сюжет matplotlib на передний план, используя:
>>> %pylab
Using matplotlib backend: MacOSX
Populating the interactive namespace from numpy and matplotlib
>>> plot([1,3,2,4])
>>> show()