如何将scikit-fuzzy的view函数嵌入Tkinter框架中显示?
scikit-fuzzy 视图嵌入Tkinter Frame实现方法
scikit-fuzzy的.view()方法底层基于matplotlib实现,默认会调用matplotlib自带GUI后端弹出独立窗口,只要手动指定绘图的坐标轴对象,绑定到Tkinter容器内的matplotlib画布,即可实现视图内嵌,不需要修改库源码。
实现步骤
- 提前导入Tkinter内嵌matplotlib所需依赖,不需要修改原有模糊逻辑的业务代码
import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 原有模糊逻辑相关导入保持不变,比如skfuzzy、skfuzzy.control相关模块
- 在Tkinter窗口中提前创建用于承载图表的目标Frame,不要直接调用无参的
.view()方法
所有scikit-fuzzy变量(前件、后件、仿真结果)的
.view()方法都支持ax入参,用来指定绘图绑定的matplotlib坐标轴,传入该参数后方法就不会新建独立窗口。
- 核心实现代码参考:
# 主窗口初始化 root = tk.Tk() root.title("模糊逻辑小费计算程序") # 指定用于嵌入图表的Frame容器,可根据自己的布局调整pack/grid位置 target_plot_frame = tk.Frame(root, width=650, height=450) target_plot_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # --- 原有模糊逻辑代码块保持不变 --- # 定义前件、后件、模糊规则、初始化仿真器、传入输入值计算结果的逻辑不需要修改 # 比如你原有的propina、simul_propinas对象的创建和计算逻辑完全不用动 # --- 原有代码块结束 --- # 在目标Frame上创建matplotlib画布与坐标轴 plot_figure = plt.Figure(figsize=(6,4), dpi=100) plot_ax = plot_figure.add_subplot(111) # 将画布绑定到Tkinter的Frame容器 tk_canvas = FigureCanvasTkAgg(plot_figure, master=target_plot_frame) tk_canvas.draw() tk_canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True) # 调用view时传入提前创建的坐标轴对象,直接在Tkinter内部绘图 propina.view(sim=simul_propinas, ax=plot_ax)
注意事项
- 代码运行前不要调用
plt.show(),否则会触发matplotlib默认窗口弹出 - 如果需要响应用户操作刷新图表(比如修改输入参数重新计算后更新结果图),不需要重建画布,参考以下逻辑即可:
def update_plot(): # 先执行重新计算仿真结果的逻辑 # simul_propinas.input["xxx"] = 新输入值 # simul_propinas.compute() # 清空原有坐标轴内容 plot_ax.clear() # 重新绘图 propina.view(sim=simul_propinas, ax=plot_ax) # 刷新画布显示新内容 tk_canvas.draw()
- 如果之前调试时多次调用
.view()残留了弹出窗口,可以在代码开头加plt.close('all')清理残留的matplotlib图窗实例,避免异常弹窗。
内容的提问来源于stack exchange,提问作者Jason lozada
相关产品推荐
相关产品推荐

