python tk开发K线图自定义控件
在股票研究分析的过程中,使用已有的商用工具如通达信有时候不太方便,比如跳转到指定的日期,标记买卖点等功能,或许可以实现,但是很难符合自己心意自如控制。所以想开发一个简单的显示K线图的工具以便自用。
当前效果:
有如下特点:
- 是标准的TK自定义控件,可以嵌入到TK应用中;
- 整个程序比较小巧,只有不到300行;
- 支持自定义标记,比如示例图中倒数第二个K线上方的'B'标记;
- 支持键盘左右键,可以移动K线图;
后续在使用过程中,其他功能可以逐步添加。
有一些设计文档,可以帮助理解程序。如下方示意图:
下面是关键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
完整代码可私信获取。