使 matplotlib 绘图窗口弹出为活动窗口

问题描述 投票:0回答:11

我正在 mac os x 上使用 python 和 matplotlib。 当我在许多不同的窗口上工作并且必须运行生成绘图的脚本时,绘图窗口总是在活动窗口后面打开,并且必须在窗口之间切换以查看图像非常令人沮丧。 是否有理由决定绘图窗口的位置,和/或将其弹出为前景窗口?

谢谢

python macos matplotlib
11个回答
17
投票

对我来说(OSX 10.10.2,Matplotlib 1.4.3),有效的方法是将 matplotlib 后端更改为 TkAgg。 在导入 pyplot 或任何东西之前,请执行以下操作:

import matplotlib
matplotlib.use('TkAgg')  

现在会弹出绘图窗口,并且可以通过 Command-Tab 进行操作。


14
投票

我也被同样的问题困扰。我终于找到了一个解决方案(在 pylab 模式下,带有 qt4agg 后端):

get_current_fig_manager().window.raise_()

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

问候, 马库斯


7
投票

我发现经常需要这个解决方案(例如,当使用 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_()

3
投票

我在这个帖子上找到了一个很好的答案: 如何让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)

2
投票

对于 MacOS Sierra 和 python 3.6,Matplotlib 2.0.0

import matplotlib.pyplot as plt
plt.get_current_fig_manager().show()

上面的行就可以完成工作,不需要任何其他东西。


1
投票

这对我有用!!

(在 Mac OS X 10.11、Spyder 2.3.5.2 - Python 3.4 上测试)

进入 Preferences > IPython console > Graphics 并将后端设置为 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()

1
投票

对我来说只有以下作品(使用 TkAgg 后端):

plt.gcf().canvas.get_tk_widget().focus_force() 

0
投票

从 MacOSX 10.11.6 上的 matplotlib 1.5.1 开始,如果您启动 iPython(5.0.0,Python:3.5.2)shell 并使用 %matplotlib,您可以使用以下命令将 matplotlib 图放在前面:

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

** 编辑:建议似乎是不要使用%pylab,因为它会污染全局名称空间 **

.. shell 并使用

%pylab
您可以使用以下命令将 matplotlib 图放在前面:

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

0
投票

可以设置

backend      : MacOSX

在您的

matplotlibrc
文件中以获得永久解决方案。

它适用于我在 macos mojave 上使用 matplotlib 2.1.2。然而,其他用户抱怨说它对他们不起作用,所以它可能会受到其他设置的影响


0
投票

以下内容适用于 Windows 上具有 Qt5 后端的 Jupyter 笔记本。我用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()

0
投票

必须添加这两行,只是

*.raise_()
不起作用

fig.canvas.manager.window.activateWindow()
fig.canvas.manager.window.raise_()
© www.soinside.com 2019 - 2024. All rights reserved.