如何在tkinter canvas组件上绘制支持动态更新的走势图表
Tkinter内嵌可更新行情图最简实现
不用纠结matplotlib里figure之类的底层概念,按下面的固定套路写,20分钟就能把功能跑通,所有按钮、标签、行情图都在同一个窗口里,更新数据也不会卡。
依赖安装
先装需要的库,命令行执行:pip install matplotlib
tkinter是Python自带的GUI库,不用额外装,装完Python就能用。
完整可运行代码
直接复制就能跑,注释标了每个部分是干嘛的,改起来很方便:
import tkinter as tk import random from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure # 初始化主窗口 root = tk.Tk() root.title("课程项目-股票交易模拟") root.geometry("800x600") # 普通控件区:标签、按钮,和你平时写tkinter控件没区别 status_lbl = tk.Label(root, text="当前状态:行情加载中", fg="#c0392b") status_lbl.pack(pady=8) buy_btn = tk.Button(root, text="买入100股", width=15, command=lambda: status_lbl.config(text="操作提示:已完成买入")) sell_btn = tk.Button(root, text="卖出100股", width=15, command=lambda: status_lbl.config(text="操作提示:已完成卖出")) buy_btn.pack(pady=3) sell_btn.pack(pady=3) # 绘图区:不用深究figure原理,把它当一张固定尺寸的画纸就行 fig = Figure(figsize=(7, 4), dpi=100) ax = fig.add_subplot(111) # 在画纸上开一块绘图区域 ax.set_title("股票实时行情走势") ax.set_xlabel("时间(单位:秒)") ax.set_ylabel("价格(单位:元)") # 初始化行情数据,初始股价设为10元 time_list = [0] price_list = [10.0] line, = ax.plot(time_list, price_list, color="#2980b9") # 画初始走势线 # 把matplotlib的图转成tkinter能识别的画布控件,和按钮一样排版到窗口里 chart_canvas = FigureCanvasTkAgg(fig, master=root) chart_canvas.get_tk_widget().pack(pady=15) # 行情更新逻辑 def refresh_chart(): # 这里替换成你自己的行情生成/获取逻辑就行,示例是随机涨跌模拟 new_time = time_list[-1] + 1 new_price = price_list[-1] + random.uniform(-0.2, 0.2) time_list.append(new_time) price_list.append(new_price) # 只保留最近50个数据点,避免图太挤、程序变卡 if len(time_list) > 50: time_list.pop(0) price_list.pop(0) # 更新线条数据,重绘画布,不要每次都重新调用plot,会卡 line.set_data(time_list, price_list) ax.relim() # 重置坐标范围 ax.autoscale_view() # 自动适配新数据的坐标轴大小 chart_canvas.draw() # 每1秒刷新一次,间隔可以自己改 root.after(1000, refresh_chart) # 启动行情刷新,跑主循环 refresh_chart() root.mainloop()
关键注意点
- 不要用matplotlib自带的
plt.show()启动窗口,那样会弹独立的绘图窗口,没法和你自己的按钮、标签放一起 - 更新数据的时候不要每次都重新
plot新线条,就用示例里的set_data()改已有线条的数据源,再重绘,效率高不卡顿 - 所有控件(按钮、标签、画布)的父容器都设成同一个主窗口
root,排版的时候和普通tkinter控件一样用pack/grid/place调整位置就行 - 你自己的交易逻辑、行情计算逻辑直接替换掉
refresh_chart里的随机数部分,算出新价格之后往price_list里加就行,不用改其他代码
内容的提问来源于stack exchange,提问作者nSiS
相关产品推荐
相关产品推荐

