【问题标题】:make matplotlib plotting window pop up as the active one使 matplotlib 绘图窗口弹出为活动窗口
【发布时间】:2012-01-02 09:16:11
【问题描述】:

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

谢谢

【问题讨论】:

  • 不幸的是,我尝试了支持的 QT4Agg,但它似乎没有效果(甚至没有投诉)

标签: python macos matplotlib


【解决方案1】:

我被完全相同的问题所困扰。我终于找到了一个解决方案(在 pylab 模式下,使用 qt4agg 后端):

get_current_fig_manager().window.raise_()

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

问候, 马库斯

【讨论】:

  • FigureManager 不再有窗口属性,我也无法在 API 或 matplotlib 源代码中找到带有 macosx、tkagg 和 agg 的 raise_(​​) 引用。
  • 它仍然适用于 Qt4Agg 后端。我将编辑答案。
  • 从命令行运行时,这会将绘图置于终端窗口上方(与我尝试的其他几种方式不同)。对于那些(像我一样)事先不知道这一点的人,要使用 QtAgg 后端,请将其放在导入 pyplot 或 pylab 之前:import matplotlib; ; matplotlib.use('Qt4Agg')
  • 只要您将 SpyderPrefs 设置为使用上述 matplotlib 后端,就可以在 MacOS 上工作。
  • 使用后端 TkAgg 时,这样做fig.canvas.manager.window.tkraise()
【解决方案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)

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • Tiny nitpick:“if figure_id is not None”可以简化为“if figure_id”
    • 我更新了函数以重新排序 if-else 并希望澄清我们必须专门针对 None 进行测试,因为 figure_id == 0 是允许的值。这应该与普遍使用 None 作为默认参数值以及随后测试 None 以启动默认行为一致。
    【解决方案4】:

    对我来说(OSX 10.10.2,Matplotlib 1.4.3),可行的是将 matplotlib 后端更改为 TkAgg。在导入 pyplot 或其他任何东西之前,请转到:

    import matplotlib
    matplotlib.use('TkAgg')  
    

    现在会弹出绘图窗口,并且可以使用命令选项卡进行操作。

    【讨论】:

      【解决方案5】:

      这对我有用!!

      (在 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()
      

      【讨论】:

        【解决方案6】:

        从 MacOSX 10.11.6 上的 matplotlib 1.5.1 开始,如果您启动 iPython (5.0.0, Python: 3.5.2) shell 和 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,因为它污染了全局命名空间 **

        .. shell 并使用 %pylab 您可以使用以下命令将 matplotlib 绘图置于最前面:

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

        【讨论】:

          【解决方案7】:

          对于 MacOS Sierra 和 python 3.6,Matplotlib 2.0.0

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

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

          【讨论】:

          • 这对我也有用。花了 30 分钟的时间在谷歌上搜索了许多看起来应该有效但没有成功的东西,直到我遇到了这个出色的单行代码。
          • @JamesPaulMason..很高兴我能帮上忙..感谢您的编辑。
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            你可以设置

            backend      : MacOSX
            

            在您的 matplotlibrc 文件中获取永久解决方案。

            它适用于我的 macos mojave,使用 matplotlib 2.1.2。但是,其他用户抱怨它不适用于他们,因此可能会受到其他设置的影响

            【讨论】:

              【解决方案10】:

              以下内容适用于 Windows 上带有 Qt5 后端的 Jupyter notebook。我使用 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()
              

              【讨论】:

                猜你喜欢
                • 2023-03-09
                • 2022-09-28
                • 2012-10-20
                • 2014-11-08
                • 2012-06-07
                • 2011-01-09
                • 2019-07-28
                • 2011-09-30
                • 1970-01-01
                相关资源
                最近更新 更多