python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.11)

前言:
小修小补,之前的版本查询功能只能点击一次,当你点击第二次的时候,窗口会增加,而且比例有问题,这次修改只是再def go():后面增加了

def go():
    for widget in stock_graphics.winfo_children():
        widget.destroy()

这一句跟省略输入代码后缀.sz .sh的函数,如下

def code_name_transform(get_stockcode):  # 输入的数字股票代码转换成字符串股票代码
    str_stockcode = str(get_stockcode)
    str_stockcode = str_stockcode.strip()  # 删除前后空格字符
    if 6 > len(str_stockcode) > 0:
        str_stockcode = str_stockcode.zfill(6) + '.SZ'  # zfill()函数返回指定长度的字符串,原字符串右对齐,前面填充0
    if len(str_stockcode) == 6:
        if str_stockcode[0:1] == '0':
            str_stockcode = str_stockcode + '.SZ'
        if str_stockcode[0:1] == '3':
            str_stockcode = str_stockcode + '.SZ'
        if str_stockcode[0:1] == '6':
            str_stockcode = str_stockcode + '.SH'
    return str_stockcode

完整代码如下:

import numpy as np
import pandas as pd
import tushare as ts
import tkinter as tk
import mplfinance as mpf
from pylab import mpl
from datetime import datetime
import tkinter.tix as tix
from tkinter.constants import *
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)

pro = ts.pro_api(''要到tushare官网注册个账户然后将token复制到这里,可以的话请帮个忙用上一篇的文章末我分享的链接注册,谢谢'')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

root = tix.Tk()  # 创建主窗口
screenWidth = root.winfo_screenwidth()  # 获取屏幕宽的分辨率
screenHeight = root.winfo_screenheight()
x, y = int(screenWidth / 4), int(screenHeight / 4)  # 初始运行窗口屏幕坐标(x, y),设置成在左上角显示
width = int(screenWidth / 2)  # 初始化窗口是显示器分辨率的二分之一
height = int(screenHeight / 2)
root.geometry('{}x{}+{}+{}'.format(width, height, x, y))  # 窗口的大小跟初始运行位置
root.title('Wilbur量化分析软件')
# root.resizable(0, 0)  # 固定窗口宽跟高,不能调整大小,无法最大窗口化
root.iconbitmap('ZHY.ico')  # 窗口左上角图标设置,需要自己放张图标为icon格式的图片文件在项目文件目录下

# 首先创建主框架
main_frame = tix.Frame(root, width=screenWidth, height=screenHeight,
                       relief=tix.SUNKEN, bg='#353535', bd=5, borderwidth=4)
main_frame.pack(fill=BOTH, expand=0)

# 在主框架下创建股票代码输入子框架
code_frame = tix.Frame(main_frame, borderwidth=1, bg='#353535')
code_frame.pack()
# 创建标签‘股票代码’
stock_label = tix.Label(code_frame, text='股票代码', bd=1)
stock_label.pack(side=LEFT)
# 创建股票代码输入框
input_code_var = tix.StringVar()
code_widget = tix.Entry(code_frame, textvariable=input_code_var, borderwidth=1, justify=CENTER)
# input_code_get = input_code_var.set(input_code_var.get())  # 获取输入的新值
code_widget.pack(side=LEFT, padx=4)

# 在主框架下创建股票日期输入框子框架
input_date_frame = tix.Frame(main_frame, borderwidth=1, bg='#353535')
input_date_frame.pack()
# 创建标签‘开始日期’
date_start_label = tix.Label(input_date_frame, text='开始日期', bd=1)
date_start_label.pack(side=LEFT)
# 创建开始日期代码输入框
input_startdate_var = tix.StringVar()
startdate_widget = tix.Entry(input_date_frame, textvariable=input_startdate_var, borderwidth=1, justify=CENTER)
input_startdate_get = input_startdate_var.set(input_startdate_var.get())  # 获取输入的新值
startdate_widget.pack(side=LEFT, padx=4)
# 创建标签‘结束日期’
date_end_label = tix.Label(input_date_frame, text='结束日期', bd=1)
date_end_label.pack(side=LEFT)
# 创建结束日期代码输入框
input_enddate_var = tix.StringVar()
enddate_widget = tix.Entry(input_date_frame, textvariable=input_enddate_var, borderwidth=1, justify=CENTER)
input_enddate_get = input_enddate_var.set(input_enddate_var.get())  # 获取输入的新值
enddate_widget.pack(side=LEFT, padx=4)


# 以下函数作用是省略输入代码后缀.sz .sh
def code_name_transform(get_stockcode):  # 输入的数字股票代码转换成字符串股票代码
    str_stockcode = str(get_stockcode)
    str_stockcode = str_stockcode.strip()  # 删除前后空格字符
    if 6 > len(str_stockcode) > 0:
        str_stockcode = str_stockcode.zfill(6) + '.SZ'  # zfill()函数返回指定长度的字符串,原字符串右对齐,前面填充0
    if len(str_stockcode) == 6:
        if str_stockcode[0:1] == '0':
            str_stockcode = str_stockcode + '.SZ'
        if str_stockcode[0:1] == '3':
            str_stockcode = str_stockcode + '.SZ'
        if str_stockcode[0:1] == '6':
            str_stockcode = str_stockcode + '.SH'
    return str_stockcode


stock_graphics = tix.Frame(root, borderwidth=1, bg='#353535', relief=tix.RAISED)
stock_graphics.pack(expand=1, fill=tk.BOTH, anchor=tk.CENTER)


# 创建股票图形输出框架
def go():
    # 清除stock_graphics框架中的控件内容,winfo_children()返回的项是一个小部件列表,
    # 以下代码作用是为每次点击查询按钮时更新图表内容,如果没有以下代码句,则每次点击查询会再生成一个图表
    for widget in stock_graphics.winfo_children():
        widget.destroy()
    stock_name = input_code_var.get()
    code_name = code_name_transform(stock_name)
    start_date = input_startdate_var.get()
    end_date = input_enddate_var.get()
    stock_data = pro.daily(ts_code=code_name, start_date=start_date, end_date=end_date)
    print(stock_data)
    data = stock_data.loc[:, ['trade_date', 'open', 'close', 'high', 'low', 'vol']]  # :取所有行数据,后面取date列,open列等数据
    data = data.rename(columns={
    
    'trade_date': 'Date', 'open': 'Open', 'close': 'Close', 'high': 'High', 'low': 'Low',
                                'vol': '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)  # 将时间顺序升序,符合时间序列

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

    canvas = FigureCanvasTkAgg(fig, master=stock_graphics)  # 设置tkinter绘制区
    canvas.draw()
    print(canvas)
    toolbar = NavigationToolbar2Tk(canvas, stock_graphics)
    toolbar.update()  # 显示图形导航工具条
    canvas._tkcanvas.pack(side=BOTTOM, fill=BOTH, expand=1)


# 在主框架下创建查询按钮子框架
search_frame = tix.Frame(main_frame, borderwidth=1, bg='#353535', relief=tix.SUNKEN)
search_frame.pack()
# 创建查询按钮并设置功能
stock_find = tix.Button(search_frame, text='查询', width=5, height=1, command=go)
stock_find.pack()

root.mainloop()

没修改前有BUG的图例:
在这里插入图片描述
修改后的图例:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wilburzzz/article/details/109079016