2011-11-20 13 views
29

Estoy trabajando con python y matplotlib en mac os x. Cuando estoy trabajando en muchas ventanas diferentes y tengo que ejecutar un script que produce un gráfico, la ventana de trazado siempre se abre detrás de la ventana activa y me frustra mucho tener que cambiar de ventana para mirar la imagen. ¿Hay alguna razón para decidir la ubicación de la ventana de trazado y/o abrirla como ventana en primer plano?hacer que la ventana de trazado de matplotlib aparezca como la activa

gracias

+0

desafortunadamente, probé el QT4Agg respaldado y no parece tener efectos (ni siquiera quejas) –

Respuesta

12

Me molestó exactamente el mismo problema. He encontrado finalmente una solución (en el modo de pylab, con backend qt4agg):

get_current_fig_manager().window.raise_() 

o

fig = gcf() 
fig.canvas.manager.window.raise_() 

Regards, Markus

+2

El FigureManager ya no tiene una propiedad de ventana, tampoco puedo encontrar la referencia raise_() en API o en la fuente matplotlib con macosx, tkagg y agg. – anddam

+0

Todavía funciona para el backend Qt4Agg. Editaré la respuesta. – mrossi

+0

funciona para mí, pero solo con Qt4Agg, no con TkAgg, no con MacOSX –

2

he encontrado una buena respuesta en este hilo: How to make a Tkinter window jump to the front?

Básicamente, la idea es usar atributos de ventana: establezca el atributo '-topmost' en True (1) para que aparezca la ventana en primer plano, y luego configúrelo en Falso (0) para que luego permita que otras ventanas aparezcan frente a él. Aquí está el código que funcionó para mí:

import matplotlib.pyplot as plt 
wm = plt.get_current_fig_manager() 
wm.window.attributes('-topmost', 1) 
wm.window.attributes('-topmost', 0) 
4

he encontrado tan a menudo era necesaria esta solución (por ejemplo, cuando se utiliza Spyder IDE), que lo envolvió en una función.

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_() 
+0

Minúsculo nitpick: "if figure_id is Not None" podría ser contratado como "if figure_id" – slehar

+1

Actualicé la función para reordenar el if-else y espero aclarar que debemos probar específicamente para None, porque figure_id == 0 es un valor permitido . Esto debería ser coherente con el uso generalizado de None como valor de argumento predeterminado con la prueba subsiguiente para None para iniciar comportamientos predeterminados. – raysabr

11

Para mí (OSX 10.10.2, Matplotlib 1.4.3), lo que funciona es cambiar el backend matplotlib a TkAgg. Antes de importar pyplot ni nada, van:

import matplotlib 
matplotlib.use('TkAgg') 

ventanas Plot ahora emergente, y puede ser de comandos Tab'ed a.

1

¡Esto funcionó para mí!

(Probado en Mac OS X, 10.11 Spyder 2.3.5.2 - Python 3.4)

Ir a Preferencias> consola IPython> Gráficos y establecer un backend para Qt (después de que es necesario reiniciar el kernel) .

Hacer un archivo que contiene:

def raise_window(figname=None): 
    if figname: plt.figure(figname) 
    cfm = plt.get_current_fig_manager() 
    cfm.window.activateWindow() 
    cfm.window.raise_() 

e importarlo en el arranque (Preferencias> consola IPython> Inicio> Ejecutar un archivo). Ahora, solo llame a la función raise_window() debajo de su código.

Ejemplo:

0

A partir de matplotlib 1.5.1 MacOSX 10.11.6, si se inicia una IPython (5.0.0, Python: 3.5.2) concha y use %matplotlib puede traer una parcela matplotlib al frente usando:

>>> %matplotlib 
Using matplotlib backend: MacOSX 
>>> import matplotlib.pyplot as plt 
>>> plt.plot([1,3,2,4]) 
>>> plt.show() 

** Editar: Consejo parece ser not to use %pylab ya que contamina el espacio de nombres global **

.. cáscara y utilizar %pylab puede traer una parcela matplotlib al frente usando:

>>> %pylab 
Using matplotlib backend: MacOSX 
Populating the interactive namespace from numpy and matplotlib 
>>> plot([1,3,2,4]) 
>>> show() 
0

para MacOS Sierra y Python 3.6, 2.0.0 matplotlib

get_current_fig_manager().show() 

la línea de arriba hace el trabajo sin necesidad de otra cosa.

Cuestiones relacionadas