Python+Tkinter實現(xiàn)股票K線圖的繪制
在前面的文章中,我們一起學習了如何通過 Python 抓取東方財富網(wǎng)的實時股票數(shù)據(jù)以及如何制作成 Tkinter GUI 程序,鏈接如下
Tkinter制作股票數(shù)據(jù)抓取小程序,有點秀!
今天我們就在這個基礎(chǔ)上,在 Tkinter 程序中繪制 K 線圖,一起來看看吧
子窗口
我們今天的整體代碼還是基于上次的 Tkinter 股票程序,在主類 MainCreator
下面創(chuàng)建一個函數(shù) create_subwindow
????def?create_subwindow(self): ????????t?=?ttk.Toplevel() ????????t.wm_title("K線圖") ????????sub_window?=?SubWindiw() ????????sub_window.subWindow(t)
我們這里使用 Toplevel
來創(chuàng)建子窗口,再來看看子窗口相關(guān)的代碼
class?SubWindiw: ????def?__init__(self): ????????pass ????def?all_files(self): ??????... ????def?getDate(self): ??????... ????def?subWindow(self,?root_frame): ??????... ????def?go(self): ??????...
對于子窗口代碼,subWindow
函數(shù)是子窗口的主要函數(shù)
子窗口框架
子窗口主要代碼如下
????def?subWindow(self,?root_frame): ????????file_list?=?self.all_files() ????????#?創(chuàng)建主框架 ????????main_frame?=?ttk.Frame(root_frame) ????????main_frame.pack() ????????#?在主框架下創(chuàng)建股票日期輸入框子框架 ????????date_frame?=?ttk.Frame(main_frame,?relief=tix.SUNKEN) ????????date_frame.pack(fill=X,?side=TOP) ????????#?創(chuàng)建標簽‘開始日期' ????????date_start_label?=?ttk.Label(date_frame,?text='開始日期') ????????date_start_label.pack(side=LEFT) ????????#?創(chuàng)建開始日期代碼輸入框 ????????re_date?=?self.getDate() ????????self.de_start?=?ttk.DateEntry(date_frame,?startdate=re_date) ????????self.de_start.pack(side=LEFT,?padx=4,?pady=4) ????????#?創(chuàng)建標簽‘結(jié)束日期' ????????date_end_label?=?ttk.Label(date_frame,?text='結(jié)束日期') ????????date_end_label.pack(side=LEFT) ????????#?創(chuàng)建結(jié)束日期代碼輸入框 ????????self.de_end?=?ttk.DateEntry(date_frame) ????????self.de_end.pack(side=LEFT,?padx=4,?pady=4) ????????#?在主框架下創(chuàng)建查詢按鈕子框架 ????????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) ????????#?創(chuàng)建查詢按鈕并設(shè)置功能 ????????stock_find?=?ttk.Button(search_frame,?text='查詢',?command=self.go) ????????stock_find.pack(pady=4,?expand=YES,?side=LEFT) ????????#?創(chuàng)建股票圖形輸出框架 ????????self.stock_graphics?=?tk.Frame(root_frame,?relief=tix.RAISED) ????????self.stock_graphics.pack(expand=1,?fill=tix.BOTH,?anchor=tix.CENTER)
主要還是分三個區(qū)域,日期選擇區(qū)域,股票文件選擇區(qū)域以及K線圖展示區(qū)域
還有兩個功能性函數(shù) 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("股票文件為空",?"請選擇股票數(shù)據(jù)文件!") ????????????return ????????stock_data?=?pd.read_csv(gupiao_file) ????????data?=?stock_data.loc[:,?['時間',?'開盤價', ??????????????????????????????????'收盤價',?'最高價',?'最低價',?'成交量(手)']]??#?:取所有行數(shù)據(jù),后面取date列,open列等數(shù)據(jù) ????????data?=?data.rename(columns={'時間':?'Date',?'開盤價':?'Open', ????????????????????????????????????'收盤價':?'Close',?'最高價':?'High',?'最低價':?'Low', ????????????????????????????????????'成交量(手)':?'Volume'})??#?更換列名,為后面函數(shù)變量做準備 ????????data.set_index('Date',?inplace=True)??#?設(shè)置date列為索引,覆蓋原來索引,這個時候索引還是 object 類型,就是字符串類型。 ????????#?將object類型轉(zhuǎn)化成 DateIndex 類型,pd.DatetimeIndex 是把某一列進行轉(zhuǎn)換,同時把該列的數(shù)據(jù)設(shè)置為索引 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("股票數(shù)據(jù)為空") ????????????messbox.showerror("股票數(shù)據(jù)為空",?"請選擇合理的時間!") ????????????return ????????my_color?=?mpf.make_marketcolors(up='r', ?????????????????????????????????????????down='g', ?????????????????????????????????????????edge='inherit', ?????????????????????????????????????????wick='inherit', ?????????????????????????????????????????volume='inherit') ????????#?設(shè)置圖表的背景色 ????????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)??#?設(shè)置tkinter繪制區(qū) ????????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 來處理數(shù)據(jù),把我們爬取到的數(shù)據(jù)處理成 mplfinance 需要的格式,如下
接下來只需要調(diào)用plot
函數(shù)即可
self.fig,?self.axlist?=?mpf.plot(data,?style=my_style,?type='candle', ?????????????????????????????????????????mav=(5,?10,?20),?volume=True,?show_nontrading=False,?returnfig=True)
到此這篇關(guān)于Python+Tkinter實現(xiàn)股票K線圖的繪制的文章就介紹到這了,更多相關(guān)Python Tkinter股票K線圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖文詳解Python中如何簡單地解決Microsoft?Visual?C++?14.0報錯
有的時候安裝python依賴包的時候,報錯信息"Microsoft?visual?c++?14.0?is?required"的解決辦法,下面這篇文章主要給大家介紹了關(guān)于Python中如何簡單地解決Microsoft?Visual?C++?14.0報錯的相關(guān)資料,需要的朋友可以參考下2023-02-02Python查找不限層級Json數(shù)據(jù)中某個key或者value的路徑方式
今天小編就為大家分享一篇Python查找不限層級Json數(shù)據(jù)中某個key或者value的路徑方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02Python程序打包工具py2exe和PyInstaller詳解
這篇文章主要介紹了Python程序打包工具py2exe和PyInstaller詳解,如果可以提前將程序打包成 Windows平臺的 .exe 文件或者是Linux下的 .sh 腳本,那么使用起來就會方便很多,需要的朋友可以參考下2019-06-06django認證系統(tǒng) Authentication使用詳解
這篇文章主要介紹了django認證系統(tǒng) Authentication使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07