Wayland会话中Matplotlib使用GTK3后端触发TypeError问题求助
我之前也碰到过类似的情况,Wayland下GTK3对光标的处理逻辑和Xorg确实不一样,这个错误核心是GTK3找不到fleur这个光标类型,导致构造Gdk Cursor时返回NULL。下面是几个可行的解决思路:
临时指定兼容的光标主题
系统默认的Adwaita光标主题是包含所有标准光标的,你可以在运行Python脚本前设置环境变量,或者在代码里提前指定:import os # 先设置光标主题,再导入Matplotlib os.environ['GTK_CURSOR_THEME'] = 'Adwaita' import matplotlib matplotlib.use('gtk3agg') # 或者gtk3cairo import matplotlib.pyplot as plt # 你的绘图代码示例 plt.plot([1,2,3]) plt.show()修改Matplotlib GTK3后端的光标映射(临时Workaround)
找到你的Matplotlib安装路径下的backend_gtk3.py(比如你这里是/usr/lib/python3.9/site-packages/matplotlib/backends/backend_gtk3.py),定位到出错的那行代码,把Gdk.CursorType.FLEUR替换成一个肯定存在的光标类型,比如HAND2或者ARROW:# 原出错代码行 # cursors.MOVE: Gdk.Cursor.new(Gdk.CursorType.FLEUR), # 修改后 cursors.MOVE: Gdk.Cursor.new(Gdk.CursorType.HAND2),注意:这个修改会在Matplotlib更新后被覆盖,适合临时应急。
切换到更兼容的后端
既然你说Qt后端在Wayland下正常,那可以优先考虑继续用Qt后端(比如Qt5Agg或者Qt6Agg);如果不需要交互式窗口,也可以用非交互式的Agg后端直接生成图片;新版本Matplotlib也支持wayland原生后端,可以试试设置matplotlib.use('wayland')。确保系统光标主题完整
检查系统是否安装了包含fleur光标的完整光标主题,比如安装adwaita-icon-theme-full(不同发行版包名可能有差异),然后在系统设置里把光标主题切换为这个完整版本。
内容的提问来源于stack exchange,提问作者liuyun

