使用tkinter编写一个非常简单的获取股价程序(数据源tushare)

2023-10-27

使用tkinter编写一个非常简单的获取股价程序(数据源tushare)


先看结果:

主界面。“获取股票信息”为更新信息按钮,“查询股票信息”为功能按钮
主界面
查询股票信息界面
在这里插入图片描述

点击查询后,输入起始终止时间,可以查看对应的价格,并绘制K线图

价格
在这里插入图片描述

K线图
在这里插入图片描述

实现方法:

  1. 安装tushare、tkinter、numpy、pandas、pylab、pyecharts
    (在命令行中输入pip install tushare)
  2. 注册tushare账号,获得token。(本程序用到的tushare数据均为免费权限)
import os
import tushare as ts
import numpy as np
import pandas as pd
import tkinter as tk
import tkinter.messagebox
from pylab import mpl
from pyecharts.charts import Kline

# 解决画图无法显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# tushare的token,相当于登录账号
token = 'xxx' # 此处输入你的token
ts.set_token(token)
pro = ts.pro_api(token)

# 主界面
window = tk.Tk()
window.title('股票信息程序')
window.geometry('500x300')

# basic为全局变量,记录股票基础信息
basic = pd.core.frame.DataFrame


# 获取股票基础信息函数,存储在basic里
def get_stock():
    global basic
    basic = pro.stock_basic(list_status='L')
    tkinter.messagebox.showinfo(title='', message='已获取最新的股票信息!')


# 查询股票信息函数
def search_stock():
    if basic.empty:
        tkinter.messagebox.showinfo(title='', message='未获取股票信息!')
        return

    window_search = tk.Toplevel(window)
    window_search.geometry('500x400')
    window_search.title('搜索股票')

    label_search = tk.Label(window_search, text='输入股票(部分)名称或代码\n例如:银行,SZ')
    label_search.grid(row=0, column=0, pady=10)

    e = tk.Entry(window_search, show=None)
    e.grid(row=0, column=1, pady=10)

    lb = tk.Listbox(window_search)
    lb.grid(row=1, column=1)

    label_tip1 = tk.Label(window_search, text='先在列表中选中某支股票\n再点击查询')
    label_tip1.grid(row=1, column=0)

    # 搜索股票功能
    def vague_search():
        lb.delete(0, "end")
        # 获得输入框中的内容
        var = e.get()
        # 将basic中的代码和名称提取到basic3(list类型)中
        basic2 = basic[['ts_code', 'name']]
        basic2['new_col'] = basic2['ts_code'] + ' ' + basic2['name']
        basic3 = np.array(basic2[['new_col']]).tolist()

        result_list = []
        search_success = False
        for name in basic3:
            if name[0].find(var) != -1:
                result_list.append(name)
                search_success = True
        if not search_success:
            tkinter.messagebox.showinfo(title='', message='不存在该名称或代码!')

        for item in result_list:
            lb.insert('end', item)

    # 显示股票信息功能
    def show_stock():
        value_name = lb.get(lb.curselection())[0]
        value = value_name[0:9]

        window_info = tk.Toplevel(window_search)
        window_info.geometry('500x300')
        window_info.title(value_name)

        label_time = tk.Label(window_info, text='请输入起始时间和终止时间,格式为年月日,例如:20200102')
        label_time.place(x=100, y=10)

        label_start = tk.Label(window_info, text='起始时间')
        label_start.place(x=100, y=50)

        label_end = tk.Label(window_info, text='终止时间')
        label_end.place(x=100, y=100)

        start_entry = tk.Entry(window_info, show=None)
        start_entry.place(x=200, y=50)

        end_entry = tk.Entry(window_info, show=None)
        end_entry.place(x=200, y=100)

        # 显示价格
        def show_info():
            s_date = start_entry.get()
            e_date = end_entry.get()
            if len(s_date) != 8 or len(e_date) != 8:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(e_date[0:4]) > 2050:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date[4:6]) > 12 or int(e_date[4:6]) > 12:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date[6:8]) > 31 or (int(s_date[6:8]) > 30 and (
                    int(s_date[4:6]) == 2 or int(s_date[4:6]) == 4 or int(s_date[4:6]) == 6 or int(s_date[4:6]) == 9
                    or int(s_date[4:6]) == 11) or (int(s_date[6:8]) > 28 and int(s_date[4:6]) == 2)):
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date) > int(e_date):
                tkinter.messagebox.showinfo(title='', message='结束日期小于开始日期!')
                return
            elif int(e_date[0:4]) - int(s_date[0:4]) >= 10:
                tkinter.messagebox.showinfo(title='', message='时间跨度长于十年!')
                return

            stock_data = pro.daily(ts_code=value, start_date=s_date, end_date=e_date)
            stock_data.rename(columns={'ts_code': '代码', 'trade_date': '日期', 'open': '开盘价', 'high': '当日最高价',
                                       'low': '当日最低价', 'close': '当日收盘价', 'pre_close': '昨日收盘价',
                                       'change': '变动', 'pct_chg': '涨跌幅', 'vol': '当日成交量', 'amount': '成交金额'}, inplace=True)
            stock_data.to_csv('价格/' + '价格 ' + value_name + ' ' + s_date + '到' + e_date + '.csv',
                              index=None, encoding='gb2312')
            os.startfile('价格\\' + '价格 ' + value_name + ' ' + s_date + '到' + e_date + '.csv')

        # 绘制K线图
        def draw_kline():
            s_date = start_entry.get()
            e_date = end_entry.get()
            if len(s_date) != 8 or len(e_date) != 8:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(e_date[0:4]) > 2050:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date[4:6]) > 12 or int(e_date[4:6]) > 12:
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date[6:8]) > 31 or (int(s_date[6:8]) > 30 and (
                    int(s_date[4:6]) == 2 or int(s_date[4:6]) == 4 or int(s_date[4:6]) == 6 or int(s_date[4:6]) == 9
                    or int(s_date[4:6]) == 11) or (int(s_date[6:8]) > 28 and int(s_date[4:6]) == 2)):
                tkinter.messagebox.showinfo(title='', message='时间格式错误!')
                return
            elif int(s_date) > int(e_date):
                tkinter.messagebox.showinfo(title='', message='结束日期小于开始日期!')
                return
            elif int(e_date[0:4]) - int(s_date[0:4]) >= 10:
                tkinter.messagebox.showinfo(title='', message='时间跨度长于十年!')
                return

            stock_data = pro.daily(ts_code=value, start_date=s_date, end_date=e_date)
            stock_data.index = pd.to_datetime(stock_data.trade_date)
            stock_data = stock_data.sort_index()
            v1 = list(stock_data.loc[:, ['open', 'close', 'low', 'high']].values)
            v0 = list(stock_data.index.strftime('%Y%m%d'))
            kline = Kline(value_name, title_text_size=15)
            kline.add("", v0, v1, is_datazoom_show=True,
                      mark_line=["average"],
                      mark_point=["max", "min"],
                      mark_point_symbolize=60,
                      mark_line_valuedim=['highest', 'lowest'])
            kline.render('K线图/' + 'K线图 ' + value_name + ' ' + s_date + '到' + e_date + '.html')
            os.startfile('K线图\\' + 'K线图 ' + value_name + ' ' + s_date + '到' + e_date + '.html')

        kline_button = tk.Button(window_info, text='绘制K线图', width=10, height=2, command=draw_kline)
        kline_button.place(x=250, y=180)

        info_button = tk.Button(window_info, text='显示价格', width=10, height=2, command=show_info)
        info_button.place(x=150, y=180)

    b1 = tk.Button(window_search, text='搜索', width=5, height=1, command=vague_search)
    b1.grid(row=0, column=2)

    b2 = tk.Button(window_search, text='查询', width=10, height=2, command=show_stock)
    b2.grid(row=2, column=1)


# 获取股票信息按钮
get_stock_button = tk.Button(window, text='获取股票信息', width=20, height=2, command=get_stock)
get_stock_button.place(x=175, y=40)

# 查询股票信息按钮
search_stock_button = tk.Button(window, text='查询股票信息', width=20, height=2, command=search_stock)
search_stock_button.place(x=175, y=120)

# 主界面循环
window.mainloop()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用tkinter编写一个非常简单的获取股价程序(数据源tushare) 的相关文章

  • 如何将base64字符串直接解码为二进制音频格式

    音频文件通过 API 发送给我们 该文件是 Base64 编码的 PCM 格式 我需要将其转换为 PCM 然后再转换为 WAV 进行处理 我能够使用以下代码解码 gt 保存到 pcm gt 从 pcm 读取 gt 保存为 wav decod
  • xlrd.biffh.XLRDError:Excel xlsx 文件;不支持[重复]

    这个问题在这里已经有答案了 我正在尝试使用读取启用宏的 Excel 工作表pandas read excel与 xlrd 库 它在本地运行良好 但是当我尝试将其推送到 PCF 时 我收到此错误 2020 12 11T21 09 53 441
  • JavaScript 相当于 Python 的参数化 string.format() 函数

    这是 Python 示例 gt gt gt Coordinates latitude longitude format latitude 37 24N longitude 115 81W Coordinates 37 24N 115 81W
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • 为什么我的代码不能根据字典解码加密字符串?

    我有一本字典 其中包含代表字母的键和值 例如一个简单的 DICT CODE b g n a p o x d t y 我收到了一个加密代码 并将该字符串转换为一个列表 其中每个项目都是一个单词 我需要根据字典中的项目来解决它 代码示例是 wo
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • numpy 使用 datetime64 进行数字化

    我似乎无法让 numpy digitize 与 datetime64 一起使用 date bins np array np datetime64 datetime datetime 2014 n 1 s for n in range 1 1
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 如何在 Python 3 中循环遍历集合,同时从集合中删除项目

    这是我的情况 我有一个list set 哪个并不重要 movieplayer我想调用的对象 preload 功能开启 该预加载函数可以立即返回 但希望将来返回一点 我想存储这个电影播放器 集合 表明它们尚未预加载 然后循环它们 调用prel
  • Pandas 滚动窗口 Spearman 相关性

    我想使用滚动窗口计算 DataFrame 两列之间的 Spearman 和 或 Pearson 相关性 我努力了df corr df col1 rolling P corr df col2 P为窗口尺寸 但我似乎无法定义该方法 添加meth
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 如何在 robobrowser-python 中发出 POST 请求

    http robobrowser readthedocs org en latest api html http robobrowser readthedocs org en latest api html 我正在尝试使用 APIbrows
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac
  • 如何获取所有mysql元组结果并转换为json

    我能够从表中获取单个数据 但是当我试图获取表上的所有数据时 我只得到一行 cnn execute sql rows cnn fetchall column t 0 for t in cnn description for row in ro

随机推荐

  • 在使用命令行环境下Scala读取输入内容时,输入内容不显示问题(未解决)

    在使用命令行环境下Scala读取输入内容时 输入内容不显示问题 如下图 使用键盘输入任意内容但是命令行没有显示任何内容 但是内容又是可以输出的 怀疑是被默认隐藏了 输出结果是如此 我不知道这是本来就这样还是我自己的问题 希望能有大佬可以答疑
  • 前台商品列表接口

    前台商品列表接口 搜索功能 1 入参判空 2 加 通配符 3 sql语句like关键字 平铺展示该商品类别及其子类别下的所有商品 排序功能 测试 查询 排序 按照类别展示该类别和他子类别下的所有商品 查询类别3和他所有子类别的商品 cont
  • 带你搞懂 Redis 中的两个策略

    面试的时候问到候选人 Redis 相关问题时 发现一个现象 一部分候选人分不清 Redis 的 键过期策略 和 内存淘汰策略 今天就来说一说这老哥俩 简单来说 过期策略就是当 key 到了指定的过期时间后 Redis 是用什么方式将其删除的
  • Python+Vue计算机毕业设计火灾与警情统计系统24b58(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • 10分钟教你掌握BigQuery语法

    BigQuery 以下简称BQ 的CRUD操作都可以通过SQL指令來完成 Create SQL INSERT statement Read SQL SELETE statement Update SQL UPDATE MERGE 虽然Big
  • stm32驱动超声波模块

    define HCSR04 PORT GPIOB define HCSR04 CLK RCC APB2Periph GPIOB define HCSR04 TRIG GPIO Pin 8 define HCSR04 ECHO GPIO Pi
  • hadoop默认对3个副本的存储策略和执行策略:

    1 首先要先了解下什么是rack 机架 集群 一个集群有多个机架 一个机架有多个机器 一个机器一个datanode或namenode节点 通常一个机架内的机器之间的网络速度会高于跨机架机器之间的网络速度 2 但是要同时保持副本存储策略的容错
  • javascript 创建对象(object)

  • javascript 中键盘快捷键(键盘事件)

    如果想要在javascript中使用快捷键 可以利用 event ctrlKey event shiftKey event altKey 来进行判断 对应的是ctrl shift 与alt 按键 事件属性可返回一个布尔值 true fals
  • Flutter 判断网络可用性

    Flutter 判断网络可用性 依赖包 dependencies connectivity 0 4 2 代码 import package connectivity connectivity dart 2019 4 18 By GX 判断网
  • LeetCode 142.环形链表II

    给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示链表尾
  • Nodejs+Extjs+Mongodb开发第一天 Nodejs环境搭建

    一 装备 我个人PC环境是Ubuntu14 JDK7 所以下面的步骤及问题也是基于此进行及产生的 二 Nodejs及npm的安装 这个安装的过程在网上有很多教程 这里就不详细讲了 html view plain copy print sud
  • 一篇文章了解Java虚拟机,Java虚拟机内存详解

    虚拟机介绍 Java虚拟机 JVM 一种用于计算机设备的规范 可用不同的方式 软件或硬件 加以实现 编译虚拟机的指令集与编译微处理器的指令集非常类似 Java虚拟机包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收堆和一个存储方法域 J
  • unity面板的旋转次序和万向锁

    每个unity物体在面板上都有一个rotation值 那么这个旋转的数值是怎么得出来的呢 假如一个物体xyz的rotation值都不为零 我们拉动面板上的数值会有这样的发现 拉动y值时物体绕世界坐标的y轴也就是竖直方向做旋转 拉动z轴物体沿
  • php websocket 示例

    php使用websocket示例详解 一 php 中处理 websocket WebSocket 连接是由客户端主动发起的 所以一切要从客户端出发 第一步是要解析拿到客户端发过来的 Sec WebSocket Key 字符串 复制代码代码如
  • 2、centos7修改最大文件数

    1 file max 系统所有进程能够打开的文件数 查看当前值 cat proc sys fs file max 修改值 file max的值要大于nr open 如果不修改nr open 那么file max至少要大于1024 1024
  • springboot启动报错:Unable to start web server; nested exception is org.springframework................

    Spring Boot启动出现错误 错误内容大概的意思是 未能加载嵌入的供web应用加载的空间 是因为缺少ServletWebServerFactory bean 解决方法 添加注释 EnableAutoConfiguration
  • inline-block布局与float布局

    1 解释一下display的几个常用的属性值 inline block inline block inline 行内元素 使元素变成行内元素 拥有行内元素的特性 即可以与其他行内元素共享一行 不会独占一行 不能更改元素的height wid
  • 掌握 Linux 调试技术

    http www ibm com developerworks cn linux sdk l debug index html ibm pcon 在 Linux 上找出并解决程序错误的主要方法 Steve Best sbest us ibm
  • 使用tkinter编写一个非常简单的获取股价程序(数据源tushare)

    使用tkinter编写一个非常简单的获取股价程序 数据源tushare 先看结果 主界面 获取股票信息 为更新信息按钮 查询股票信息 为功能按钮 查询股票信息界面 点击查询后 输入起始终止时间 可以查看对应的价格 并绘制K线图 价格 K线图