如何阻止matplotlib图形窗口前置?升级2.1.1后pause()触发该问题
解决Matplotlib 2.1.1中pause()频繁将窗口前置的问题
我来帮你搞定这个升级Matplotlib后遇到的烦人事儿~从1.5升到2.1.1后,每次调用pause()都把图形窗口怼到前台,确实挺影响工作的,下面给你几个实用的解决办法:
方法1:替换pause()为draw()+sleep()组合
pause()内部的实现逻辑在2.x版本里改了,会强制触发窗口前置。我们可以用更温和的方式实现“更新图形+暂停”的需求:
import time import matplotlib.pyplot as plt # 先绘制初始图形,用非阻塞模式显示 plt.plot([1, 3, 2]) plt.show(block=False) # 替换原有的plt.pause(0.3) plt.draw() # 仅更新图形内容 time.sleep(0.3) # 实现暂停,不会触发窗口前置
这个方法完全避开了pause()的窗口触发逻辑,效果和原来的暂停功能一致,还不会打扰你当前的操作。
方法2:切换到其他后端试试
TkAgg后端在2.1.1版本的pause()实现有这个小问题,你可以换成Qt5Agg后端试试,很多用户反馈这个后端没有窗口前置的问题:
# 一定要在导入pyplot之前设置后端 import matplotlib matplotlib.use('Qt5Agg') import matplotlib.pyplot as plt # 之后正常写你的绘图和pause代码 plt.plot([1,2,3]) plt.show(block=False) plt.pause(0.5)
注意:切换到Qt5Agg需要先安装PyQt5依赖,你可以用pip install pyqt5来安装。
方法3:手动控制Tkinter窗口的堆叠顺序
如果就是不想换后端,也可以直接操作TkAgg底层的窗口对象,每次pause()后把窗口手动降到后台:
import matplotlib.pyplot as plt fig = plt.figure() plt.plot([1, 3, 5]) plt.show(block=False) plt.pause(0.5) # 获取底层的Tkinter窗口实例 tk_window = fig.canvas.manager.window tk_window.lower() # 将窗口置于所有窗口之后
这个方法有点“hack”,但胜在不需要改太多原有代码,适合临时救急。
补充说明
这个问题是Matplotlib 2.x版本对TkAgg后端的pause()函数做了行为变更导致的——之前只有新建窗口时才会将窗口前置,后来为了确保图形能被用户看到,每次pause()都会强制raise窗口,这就造成了困扰。
内容的提问来源于stack exchange,提问作者kaymes
相关产品推荐
相关产品推荐

