VS Code运行Python代码时matplotlib Figure窗口自动关闭如何解决
问题描述
开发简单模糊逻辑项目时,在Visual Studio Code环境下运行代码,Plot/Figure绘图窗口会在代码执行完毕后自动关闭,终端无任何报错信息,原始实现代码如下:
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl import matplotlib.pyplot as plt class fuzzyNilai: def __init__(self): self.forum = ctrl.Antecedent(np.arange(0, 11, 1), 'forum') self.disiplin = ctrl.Antecedent(np.arange(0, 11, 1), 'disiplin') self.NilaiQuizUjian = ctrl.Antecedent(np.arange(0, 11, 1), 'nilai') self.NilaiAkhir = ctrl.Consequent(np.arange(0, 101, 1), 'nilaiakhir') def membership(self): self.forum.automf(3) self.disiplin.automf(3) self.NilaiQuizUjian.automf(3) plt = fuzzyNilai() plt.membership() plt.forum.view()
故障原因
- 代码中实例化
fuzzyNilai类时使用plt作为变量名,直接覆盖了开头导入的matplotlib.pyplot模块引用,会导致matplotlib的窗口控制逻辑异常 - matplotlib默认在脚本执行到末尾时直接终止进程,没有启动事件循环等待用户操作,因此绘图窗口会随脚本执行结束直接销毁,不会持续驻留
修复方案
- 更换类实例的变量名,不要占用
plt作为matplotlib.pyplot别名的命名空间,避免模块引用被覆盖 - 在所有绘图逻辑的末尾添加
plt.show()方法,启动matplotlib的GUI事件循环,阻塞脚本退出流程,直到用户手动关闭绘图窗口
修复后的完整可运行代码如下:
import numpy as np import skfuzzy as fuzz from skfuzzy import control as ctrl import matplotlib.pyplot as plt class fuzzyNilai: def __init__(self): self.forum = ctrl.Antecedent(np.arange(0, 11, 1), 'forum') self.disiplin = ctrl.Antecedent(np.arange(0, 11, 1), 'disiplin') self.NilaiQuizUjian = ctrl.Antecedent(np.arange(0, 11, 1), 'nilai') self.NilaiAkhir = ctrl.Consequent(np.arange(0, 101, 1), 'nilaiakhir') def membership(self): self.forum.automf(3) self.disiplin.automf(3) self.NilaiQuizUjian.automf(3) # 更换实例名,避免覆盖plt引用 fuzzy_calc = fuzzyNilai() fuzzy_calc.membership() fuzzy_calc.forum.view() # 启动事件循环保持窗口打开 plt.show()
如果使用VS Code的Python扩展默认的内嵌绘图模式,也可以在设置中搜索
Python > Plotting: Matplotlib Backend,将后端切换为非内嵌的GUI后端(比如TkAgg、Qt5Agg),运行后就会弹出独立的绘图窗口,配合plt.show()即可保持窗口常驻。
内容的提问来源于stack exchange,提问作者HuckleFinn
相关产品推荐
相关产品推荐

