Python+Tkinter实现股票K线图的绘制

 更新时间:2022年08月25日 10:37:16   作者:周萝卜  
K线图又称蜡烛图,常用说法是“K线”。K线是以每个分析周期的开盘价、最高价、最低价和收盘价绘制而成。本文将利用Python+Tkinter实现股票K线图的绘制,需要的可以参考一下

在前面的文章中,我们一起学习了如何通过 Python 抓取东方财富网的实时股票数据以及如何制作成 Tkinter GUI 程序,链接如下

用 Python 爬取股票实时数据 

Tkinter制作股票数据抓取小程序,有点秀!

今天我们就在这个基础上,在 Tkinter 程序中绘制 K 线图,一起来看看吧

子窗口

我们今天的整体代码还是基于上次的 Tkinter 股票程序,在主类 MainCreator 下面创建一个函数 create_subwindow

    def create_subwindow(self):
        t = ttk.Toplevel()
        t.wm_title("K线图")
        sub_window = SubWindiw()
        sub_window.subWindow(t)

我们这里使用 Toplevel 来创建子窗口,再来看看子窗口相关的代码

class SubWindiw:
    def __init__(self):
        pass
    def all_files(self):
      ...
    def getDate(self):
      ...
    def subWindow(self, root_frame):
      ...
    def go(self):
      ...

对于子窗口代码,subWindow 函数是子窗口的主要函数

子窗口框架

子窗口主要代码如下

    def subWindow(self, root_frame):
        file_list = self.all_files()

        # 创建主框架
        main_frame = ttk.Frame(root_frame)
        main_frame.pack()

        # 在主框架下创建股票日期输入框子框架
        date_frame = ttk.Frame(main_frame, relief=tix.SUNKEN)
        date_frame.pack(fill=X, side=TOP)
        # 创建标签‘开始日期'
        date_start_label = ttk.Label(date_frame, text='开始日期')
        date_start_label.pack(side=LEFT)
        # 创建开始日期代码输入框
        re_date = self.getDate()
        self.de_start = ttk.DateEntry(date_frame, startdate=re_date)
        self.de_start.pack(side=LEFT, padx=4, pady=4)
        # 创建标签‘结束日期'
        date_end_label = ttk.Label(date_frame, text='结束日期')
        date_end_label.pack(side=LEFT)
        # 创建结束日期代码输入框
        self.de_end = ttk.DateEntry(date_frame)
        self.de_end.pack(side=LEFT, padx=4, pady=4)

        # 在主框架下创建查询按钮子框架
        search_frame = ttk.Frame(main_frame, relief=tix.SUNKEN)
        search_frame.pack(fill=X, side=TOP)
        # 文件选择框
        search_label = ttk.Label(search_frame, text='选择股票文件')
        search_label.pack(side=LEFT)
        values = file_list
        self.cbo = ttk.Combobox(
            master=search_frame,
            values=values,
            width=45,
        )
        self.cbo.pack(side=LEFT, expand=YES, pady=5, fill=X)

        # 占位 check button
        cb = ttk.Checkbutton(search_frame, text="占位")
        # cb.pack(side=LEFT, padx=5, fill=X)

        # 创建查询按钮并设置功能
        stock_find = ttk.Button(search_frame, text='查询', command=self.go)
        stock_find.pack(pady=4, expand=YES, side=LEFT)

        # 创建股票图形输出框架
        self.stock_graphics = tk.Frame(root_frame, relief=tix.RAISED)
        self.stock_graphics.pack(expand=1, fill=tix.BOTH, anchor=tix.CENTER)

主要还是分三个区域,日期选择区域,股票文件选择区域以及K线图展示区域

还有两个功能性函数 all_files 和 getDate

all_files

    def all_files(self):
        file_list = []
        for root, dirs, files in os.walk("./"):
            for f in files:
                if 'csv' in f and 'days' in f:
                    file_list.append(f)
        return file_list

getDate

    def getDate(self):
        today = datetime.datetime.now()
        offset = datetime.timedelta(days=-1)
        re_date = (today + offset).strftime('%Y/%m/%d')
        return today + offset

绘制K线图

最后我们看看绘制K线图的代码

    def go(self):
        code_name = self.cbo.get()
        start_date = self.de_start.entry.get()
        end_date = self.de_end.entry.get()
        gupiao_file = self.cbo.get()
        if not gupiao_file:
            messbox.showerror("股票文件为空", "请选择股票数据文件!")
            return
        stock_data = pd.read_csv(gupiao_file)
        data = stock_data.loc[:, ['时间', '开盘价',
                                  '收盘价', '最高价', '最低价', '成交量(手)']]  # :取所有行数据,后面取date列,open列等数据
        data = data.rename(columns={'时间': 'Date', '开盘价': 'Open',
                                    '收盘价': 'Close', '最高价': 'High', '最低价': 'Low',
                                    '成交量(手)': 'Volume'})  # 更换列名,为后面函数变量做准备
        data.set_index('Date', inplace=True)  # 设置date列为索引,覆盖原来索引,这个时候索引还是 object 类型,就是字符串类型。
        # 将object类型转化成 DateIndex 类型,pd.DatetimeIndex 是把某一列进行转换,同时把该列的数据设置为索引 index。
        data.index = pd.DatetimeIndex(data.index)
        data = data.sort_index(ascending=True)  # 将时间顺序升序,符合时间序列
        data = data[data.index < end_date][data.index > start_date]

        if not data.values.any():
            print("股票数据为空")
            messbox.showerror("股票数据为空", "请选择合理的时间!")
            return
        my_color = mpf.make_marketcolors(up='r',
                                         down='g',
                                         edge='inherit',
                                         wick='inherit',
                                         volume='inherit')
        # 设置图表的背景色
        my_style = mpf.make_mpf_style(marketcolors=my_color,
                                      figcolor='#002B36',
                                      facecolor='#002B36',
                                      edgecolor='w',
                                      # gridcolor='(0.82, 0.83, 0.85)',
                                      rc={'font.family': 'SimHei',
                                          'xtick.labelcolor': 'white',
                                          'ytick.labelcolor': 'white',
                                          'axes.labelcolor': 'white',
                                          })
        self.fig, self.axlist = mpf.plot(data, style=my_style, type='candle',
                                         mav=(5, 10, 20), volume=True, show_nontrading=False, returnfig=True)
        canvas = FigureCanvasTkAgg(self.fig, master=self.stock_graphics)  # 设置tkinter绘制区
        if len(self.stock_graphics.winfo_children()) == 2:
            self.stock_graphics.winfo_children()[0].destroy()
        canvas.draw()

        canvas._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)

我们通过 Matplotlib + mplfinance 来绘制K线图

首先是通过 Pandas 来处理数据,把我们爬取到的数据处理成 mplfinance 需要的格式,如下

接下来只需要调用plot函数即可

self.fig, self.axlist = mpf.plot(data, style=my_style, type='candle',
                                         mav=(5, 10, 20), volume=True, show_nontrading=False, returnfig=True)

到此这篇关于Python+Tkinter实现股票K线图的绘制的文章就介绍到这了,更多相关Python Tkinter股票K线图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中异常捕获与处理的方法总结

    Python中异常捕获与处理的方法总结

    Python异常是在程序执行时发生的错误,可能会导致程序终止运行。这篇文章主要为大家总结了Python中异常捕获与处理的方法,需要的可以参考一下
    2023-04-04
  • python机器学习朴素贝叶斯算法及模型的选择和调优详解

    python机器学习朴素贝叶斯算法及模型的选择和调优详解

    这篇文章主要为大家介绍了python机器学习朴素贝叶斯及模型的选择和调优示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • 2024最新Pytorch安装图文教程(Anaconda+GPU)

    2024最新Pytorch安装图文教程(Anaconda+GPU)

    本文详细介绍了如何使用Anaconda创建虚拟环境,并在该环境中安装CUDA和cuDNN,最后安装支持GPU的PyTorch,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-11-11
  • python 利用matplotlib在3D空间绘制二次抛物面的案例

    python 利用matplotlib在3D空间绘制二次抛物面的案例

    这篇文章主要介绍了python 利用matplotlib在3D空间绘制二次抛物面的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Python优雅处理日志记录的方法小结

    Python优雅处理日志记录的方法小结

    日志记录在软件开发中扮演着至关重要的角色,它不仅可以帮助开发人员跟踪应用程序的状态和行为,还能提供有价值的诊断信息,本文将深入探讨 Python 中优雅处理日志的方法,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-12-12
  • Python Pandas条件筛选功能

    Python Pandas条件筛选功能

    这篇文章主要介绍了Python Pandas条件筛选功能,筛选是在平时的工作中使用非常频繁的功能了,下文详细的相关资料介绍,需要的小伙伴可以参考一下
    2022-03-03
  • Python实现PS图像调整之对比度调整功能示例

    Python实现PS图像调整之对比度调整功能示例

    这篇文章主要介绍了Python实现PS图像调整之对比度调整功能,结合实例形式分析了Python实现PS图像对比度调整的原理、实现方法及相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 新手该如何学python怎么学好python?

    新手该如何学python怎么学好python?

    怎么学好python?怎么灵活应用python?
    2008-10-10
  • Python 并列和或者条件的使用说明

    Python 并列和或者条件的使用说明

    这篇文章主要介绍了Python 并列和或者条件的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python动态进度条的实现代码

    python动态进度条的实现代码

    有时候我们需要使用print打印工作进度,正常使用print函数会导致刷屏的现象,本文通过实例代码给大家介绍python动态进度条的实现方法,感兴趣的朋友跟随小编一起看看吧
    2019-07-07

最新评论