You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PyQt5构建的Matplotlib GUI中使用LaTeX标签遇锁错误求助

解决PyQt5+Matplotlib GUI在Jupyter中使用LaTeX标签的锁文件错误问题

看起来你遇到的是Matplotlib的TeX缓存锁冲突问题,结合你在Jupyter Notebook中运行PyQt5 GUI的场景,我来帮你拆解原因和解决办法:

问题根源

Jupyter Notebook本身会默认使用Matplotlib的交互式后端(比如inline或者notebook),而你的GUI代码又手动指定了Qt5Agg后端。当两个不同的后端实例同时尝试访问Matplotlib的TeX缓存目录时,就会出现锁文件竞争,导致TimeoutError。另外,LaTeX配置的时机不对也可能加重这个问题。

具体解决方案

1. 先清理残留的锁文件

首先按照错误提示,手动删除那个锁文件:

C:\Users\Owner\.matplotlib\tex.cache\3bbc0f8d536770a62891b7cc8788c317.tex.matplotlib-lock

同时关闭所有Jupyter会话和Python进程,确保没有残留的Matplotlib进程占用缓存。

2. 统一Matplotlib后端配置

在你的GUI代码最开头,导入任何Matplotlib模块之前,强制指定使用Qt5后端,避免Jupyter的默认后端和它冲突:

import matplotlib
# 强制使用Qt5Agg后端,要放在导入Figure、FigureCanvas之前
matplotlib.use('Qt5Agg')

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import (
    FigureCanvasQTAgg as FigureCanvas,
    NavigationToolbar2QT as NavigationToolbar)

3. 正确配置LaTeX环境

  • 确保你的系统已经安装了LaTeX发行版(比如MiKTeX或TeX Live),并且已经添加到系统PATH中。
  • 将LaTeX的rc配置放在后端设置之后,创建Figure之前:
# 配置LaTeX支持
matplotlib.rc('text', usetex=True)
matplotlib.rc('font', family='serif')

4. 修改代码结构,确保配置生效

把LaTeX配置应用到你的示例图表中,比如修改fig1的标签:

fig1 = Figure()
ax1f1 = fig1.add_subplot(111)
ax1f1.plot(np.random.rand(5))
# 设置LaTeX格式的标签
ax1f1.set_xlabel(r'\textbf{Time (s)}')
ax1f1.set_ylabel(r'\textit{Amplitude}')
ax1f1.set_title(r'\LaTeX\ Test: $\sin(x)$')

5. 测试单独运行脚本

先脱离Jupyter环境,直接用Python运行你的GUI脚本,验证LaTeX标签是否正常显示。如果正常,再回到Jupyter中运行——此时Jupyter会使用你指定的Qt5后端,避免冲突。

修改后的完整代码示例

import matplotlib
# 强制指定Qt5后端,必须放在最前面
matplotlib.use('Qt5Agg')
# 配置LaTeX
matplotlib.rc('text', usetex=True)
matplotlib.rc('font', family='serif')

from PyQt5.uic import loadUiType
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import (
    FigureCanvasQTAgg as FigureCanvas,
    NavigationToolbar2QT as NavigationToolbar)

Ui_MainWindow, QMainWindow = loadUiType('window.ui')

class Main(QMainWindow, Ui_MainWindow) :
    def __init__(self, ) :
        super(Main, self).__init__()
        self.setupUi(self)
        self.fig_dict = {}
        self.mplfigs.itemClicked.connect(self.changefig)
        fig = Figure()
        self.addmpl(fig)
    
    def addfig(self, name, fig) :
        self.fig_dict[name] = fig
        self.mplfigs.addItem(name)
    
    def addmpl(self, fig) :
        self.canvas = FigureCanvas(fig)
        self.mplvl.addWidget(self.canvas)
        self.canvas.draw()
        self.toolbar = NavigationToolbar(self.canvas, self.mplwindow, coordinates=True)
        self.mplvl.addWidget(self.toolbar)
    
    def changefig(self, item) :
        text = item.text()
        self.remove_mpl()
        self.addmpl(self.fig_dict[text])
    
    def remove_mpl(self, ) :
        self.mplvl.removeWidget(self.canvas)
        self.canvas.close()
        self.mplvl.removeWidget(self.toolbar)
        self.toolbar.close()
    
    def closeEvent(self, event) :
        QApplication.quit()

if __name__ == "__main__" :
    import sys
    from PyQt5.QtWidgets import QApplication
    import numpy as np
    
    fig1 = Figure()
    ax1f1 = fig1.add_subplot(111)
    ax1f1.plot(np.random.rand(5))
    # 添加LaTeX格式的标签
    ax1f1.set_xlabel(r'\textbf{Time (s)}')
    ax1f1.set_ylabel(r'\textit{Random Value}')
    ax1f1.set_title(r'\LaTeX\ Formatted Title')
    
    fig2 = Figure()
    ax1f2 = fig2.add_subplot(121)
    ax1f2.plot(np.random.rand(5))
    ax2f2 = fig2.add_subplot(122)
    ax2f2.plot(np.random.rand(10))
    
    fig3 = Figure()
    ax1f3 = fig3.add_subplot(111)
    ax1f3.pcolormesh(np.random.rand(20,20))
    ax1f3.set_xlabel(r'\textbf{X Axis}')
    
    app = QApplication(sys.argv)
    main = Main()
    main.addfig('One plot (LaTeX)', fig1)
    main.addfig('Two plots', fig2)
    main.addfig('Pcolormesh', fig3)
    main.show()
    sys.exit(app.exec_())

额外提示

如果在Jupyter中运行还是有问题,可以尝试:

  • 重启Jupyter内核,确保之前的后端配置被清空。
  • 在Jupyter的第一个代码单元格中先运行%matplotlib qt5魔法命令,强制切换到Qt5后端,再运行你的GUI代码。

内容的提问来源于stack exchange,提问作者Physics Penguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:22:55