2011-11-20 121 views
29

我在mac os上使用python和matplotlib x。 当我在很多不同的窗口上工作时,我必须运行一个能产生图形的脚本,图形窗口总是在活动窗口后面打开,并且非常沮丧不得不在窗口之间切换以查看图像。 这是为什么决定绘图窗口的位置,和/或弹出它作为前景窗口?使matplotlib绘图窗口作为活动窗口弹出

谢谢

+0

不幸的是,我试过QT4Agg支持,它似乎没有效果(甚至没有投诉) –

回答

12

我很困扰完全相同的问题。我发现最后的解决方案(在pylab模式下,qt4agg后端):

get_current_fig_manager().window.raise_() 

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

问候, 马库斯

+2

该图形管理器不再有一个窗口属性,我也找不到raise_()引用API或matplotlib源macosx,tkagg和agg。 – anddam

+0

它仍然适用于Qt4Agg后端。我将编辑答案。 – mrossi

+0

它适用于我,但只适用于Qt4Agg,不适用于TkAgg,不适用于MacOSX –

2

我发现这个线程一个很好的答案: How to make a Tkinter window jump to the front?

基本上,这个想法是使用窗口属性 - 将'-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) 
4

我发现这种溶液经常需要(例如使用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_() 
+0

小小的挑选:“如果figure_id不是None”可以缩写为“if figure_id” – slehar

+1

我更新了函数以重新排序if-else并希望澄清我们必须专门为None进行测试,因为figure_id == 0是一个允许的值。这应该与普遍使用None作为默认参数值一致,后续测试None以启动默认行为。 – raysabr

11

对我来说(OSX 10.10.2,Matplotlib 1.4.3),什么工作是改变matplotlib后端TkAgg。进口pyplot或任何东西之前,去:

import matplotlib 
matplotlib.use('TkAgg') 

情节Windows现在弹出,可命令Tab'ed来。

1

这对我有效!

(测试在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()即可。

实施例:

0

作为MacOSX上10.11.6 matplotlib 1.5.1的,如果启动一个IPython的(5.0.0,Python的:3.5。2)外壳和use %matplotlib您可以使用带来matplotlib阴谋面前:

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

** 编辑:建议似乎是not to use %pylab因为它污染了全局命名空间 **

..壳并使用%pylab您可以使用带来matplotlib阴谋面前:

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

适用于MacOS塞拉利昂和Python 3.6,Matplotlib 2.0.0

get_current_fig_manager().show() 

上述行不需要其他任何东西。