如何将mplfinance绘制的图表嵌入tkinter的同一个根框架中展示
解决方案
核心原理
mplfinance基于matplotlib封装,你可以通过获取它生成的matplotlib Figure对象,用matplotlib的Tkinter后端画布组件将图表嵌入到你的Tkinter主窗口中,避免弹出独立窗口。
原代码的已知问题
- 按钮
command参数错误传入candle(),会导致程序启动时就直接执行绘图逻辑,而非点击按钮后触发,正确写法是传入不带括号的函数名candle - 默认调用
mpf.plot()会自动触发matplotlib独立窗口渲染,是第二个窗口的来源
修改后可直接运行的代码
import pandas as pd import mplfinance as mpf from tkinter import * from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk root = Tk() root.title("candle") root.geometry('600x700') # 用于存储之前的画布,避免多次点击重复生成 canvas = None def candle(): global canvas # 先销毁之前的画布(如果存在) if canvas: canvas.get_tk_widget().destroy() file = 'BTC-USD.csv' data = pd.read_csv(file) data.Date = pd.to_datetime(data.Date) data = data.set_index('Date') # 核心:调用plot时加returnfig=True获取figure对象,不弹出独立窗口 fig, axlist = mpf.plot(data, type='candle', mav=(20), volume=True, style='yahoo', returnfig=True, block=False) # 将figure绑定到Tkinter画布 canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() # 放置画布 canvas.get_tk_widget().pack(fill=BOTH, expand=1) # 可选:添加matplotlib的工具栏(缩放、保存等功能) toolbar = NavigationToolbar2Tk(canvas, root) toolbar.update() button = Button(root, text="生成K线图", command=candle) button.pack(pady=5) root.mainloop()
关键参数说明
returnfig=True:让mpf.plot()返回生成的Figure对象和轴对象列表,而非直接渲染弹出窗口block=False:避免绘图逻辑阻塞Tkinter的主事件循环
原运行效果

内容的提问来源于stack exchange,提问作者Misha Pakhomov
相关产品推荐
相关产品推荐

