2011-11-20 166 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() 

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