You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:45:35