python tk开发K线图自定义控件

在股票研究分析的过程中,使用已有的商用工具如通达信有时候不太方便,比如跳转到指定的日期,标记买卖点等功能,或许可以实现,但是很难符合自己心意自如控制。所以想开发一个简单的显示K线图的工具以便自用。
当前效果:
image
有如下特点:

  1. 是标准的TK自定义控件,可以嵌入到TK应用中;
  2. 整个程序比较小巧,只有不到300行;
  3. 支持自定义标记,比如示例图中倒数第二个K线上方的'B'标记;
  4. 支持键盘左右键,可以移动K线图;
    后续在使用过程中,其他功能可以逐步添加。
    有一些设计文档,可以帮助理解程序。如下方示意图:
    image
    下面是关键K线绘制函数:
def draw_one(self, index:int, kline:DayKline)->bool:
        '''
        绘制一个完整K线.
        @param index: 表示从视图右边开始, 第n个K线的索引, 从0开始计数.
        @param kline: 表示要绘制的K线数据
        返回值: 如果绘制成功, 返回True, 否则返回False. 如果返回False, 表示当前K线已经超出视图范围, 不再绘制.
        '''
        color = self._get_color(kline)  # 计算当前K线柱体颜色
        # 计算当前K线柱体两侧x坐标
        left_x, right_x = self._get_pair_x(index)
        if left_x==None or right_x==None: return False  # 如果当前K线已经超出视图范围, 不再绘制
        top_y = self.get_y(kline.open)  # 计算当前K线柱体上边y坐标
        bottom_y = self.get_y(kline.close)  # # 计算当前K线柱体下边y坐标
        s.canvas.create_rectangle(  # 绘制当前K线柱体
            left_x, top_y, right_x, bottom_y, 
            fill=color,    # 填充色
            outline=color, # 边框色
        )
        # 绘制当前K线柱体中间的细线
        middle_x = left_x + (right_x-left_x)//2
        s.canvas.create_line(
            middle_x, self.get_y(kline.low), middle_x, self.get_y(kline.high),
            fill=color
        )
        # 绘制当前K线柱体上方的标签
        if kline.date in s.marks:
            s.canvas.create_text(middle_x, self.get_y(kline.high)-10,
                                text=s.marks[kline.date], fill="red")
        #print(f'left_x:{left_x}; right_x:{right_x}; ')
        # 下面顺便绘制当前K线的成交量柱
        s.sVolumeChart.draw_one(kline,left_x, right_x, color)
        return True

完整代码可私信获取。

posted @ 2025-07-05 20:21  顺其自然,道法自然  阅读(49)  评论(0)    收藏  举报