Сделать всплывающее окно с графикой 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()
Другие вопросы по тегам