吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8088|回复: 101
收起左侧

[原创工具] 桌面股票窗口小程序

  [复制链接]
wrsg 发表于 2022-11-27 14:30
本帖最后由 wrsg 于 2022-11-28 15:16 编辑

桌面股票窗口小程序,不断更新中,大家有什么建议欢迎留言.  
附python源码(欢迎反馈)
运行需要两个文件:  main_exe文件+config.ini配置文件
链接:https://pan.baidu.com/s/1sddBAA2jV4lLApmVcLqvSA?pwd=1024
提取码:1024

-----------------------
version : 1.0
增加线程执行,窗口移动不卡顿
-----------------------
version : 1.1
格式调整
-----------------------
version : 1.2
增加 右键退出功能;
-----------------------
version : 1.2.1
增加代码出错提示
-----------------------
version : 1.2.2
增加 config.ini代码键值重复错误的提示
增加 config.ini窗体透明度错误的提示
-----------------------
version : 1.2.3
增加快捷键隐藏功能
Alt + 1 隐藏
Alt + 2 显示
-----------------------
version : 1.3.0
增加窗体拖动功能
-----------------------
version : 1.3.1
底色全部改为灰色
发现在透明度低的时候,透明底色看不清
-----------------------
界面演示.jpg

config.jpg

readme.jpg
源码.jpg

免费评分

参与人数 19吾爱币 +21 热心值 +18 收起 理由
confiant + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
aeiouybl + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
飘在河西 + 1 + 1 摸鱼利其啊
syslxx + 1 + 1 我很赞同!
沧海轻舟 + 1 谢谢@Thanks!
alpha_puro + 1 + 1 摸鱼神奇
mgsoft + 1 + 1 涨了红色,跌了绿色,可以加上吗?
lqy1328 + 1 + 1 热心回复!
陈真棒 + 1 + 1 谢谢@Thanks!
LUO000602 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
852059438 + 1 + 1 谢谢@Thanks!
qumolishang + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qcahl + 1 我很赞同!
basfan + 1 + 1 感谢分享,已收藏!!!
qq42773175 + 1 谢谢@Thanks!
elaplace + 1 + 1 谢谢@Thanks!
dddsx6324 + 1 我很赞同!
virs520 + 1 + 1 热心回复!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| wrsg 发表于 2022-11-28 14:54
本帖最后由 wrsg 于 2023-2-19 15:13 编辑

在此楼动态更新版本说明:

2023/2/19更新
-----------------------
version : 4.0
更改为腾讯接口,支持港股
注意: config.ini内容已改变,旧版本需要替换为新版内容
-----------------------
 楼主| wrsg 发表于 2022-11-29 15:35
本帖最后由 wrsg 于 2022-11-29 15:39 编辑
pwdobwq 发表于 2022-11-29 14:26
不用定制,其实配置里加入0和1判断自定义就可以,

我其实是来看看有没有显示基金功能的过客……

v1.3.3 已更新,哈哈...

基金也是没问题的哦,比如  上交所的500ETF(510500) ,  在配置文件(config.ini)里添加代码   stock_code5  = 0510500 即可.
mgsoft 发表于 2023-3-1 13:48
本帖最后由 mgsoft 于 2023-3-1 13:56 编辑

python源码加了涨红色跌绿色,颜色可通过config.ini修改。
[Python] 纯文本查看 复制代码
# coding=utf-8

import time
from get_data_tencent import get_realtime_data
import tkinter as tk                      # 图形界面
import configparser                       # 加载config.ini
import random
import threading                          # 多线程模块
import keyboard                           # 全局热键
import os
import sys




####################################################################
# 更新数据,config.ini可修改更新时间
def data_update(stock_code_list):
    while True:
        DataColumn  =  conf.get( 'window', 'DataColumn' )
        list_data3 = []
        list_data4 = []
        for i in stock_code_list:
            tick = get_realtime_data(i)
            try:                    # try excpt:  捕捉错误,然后提示
                #list_data3.append(format(random.random(), '.2%').rjust(8,' ')) # 测试使用
                list_data3.append(format(str(tick.price).center(10,' ')))    
                list_data4.append(format(float(tick.percent)/100,'.2%'))
            except (AttributeError):
                list_data3.append(' ')
                list_data4.append(' ')
        for i,item in enumerate (list_data3):
            listbox3.delete(i)
            listbox3.insert(i,item)
        for i,item in enumerate (list_data4):
            listbox4.delete(i)
            listbox4.insert(i,item)
        #根据涨跌改变每行文字颜色
        for i,item in enumerate (list_data4):
            if(float(list_data4[i].replace('%',''))<0):
               if(DataColumn == '0' or DataColumn == '1'):
                 listbox1.itemconfig(i,fg=diecolor)
               if(DataColumn == '0' or DataColumn == '2'):  
                 listbox2.itemconfig(i,fg=diecolor)
               listbox3.itemconfig(i,fg=diecolor)
               listbox4.itemconfig(i,fg=diecolor)
            if(float(list_data4[i].replace('%',''))>0):
               if(DataColumn == '0' or DataColumn == '1'):
                  listbox1.itemconfig(i,fg=zhangcolor)
               if(DataColumn == '0' or DataColumn == '2'):  
                  listbox2.itemconfig(i,fg=zhangcolor)
               listbox3.itemconfig(i,fg=zhangcolor)
               listbox4.itemconfig(i,fg=zhangcolor)
        time.sleep(times)
        
        

# 右键关闭窗口并退出程序运行
def window_off():
    window.destroy()   # window.quit() 绕过根window.mainloop()
    exit()  # python退出

# 右键重新加载,重新运行本程序,重新加载config.ini
def reload():
    os.execvp(sys.executable, [sys.executable]+sys.argv)
    

####################################################################     


if __name__ == "__main__":

    # stock_code = '1123077'
    # stock_code_list = ['1000002','1123077']

    #读取配置文件获取代码列表 config.ini
    conf = configparser.ConfigParser()

    try:
        conf.read(filenames="config.ini",encoding="utf-8-sig") # utf-8 读取记事本修改过的ini文件会出错
        times  = int( conf.get( 'window', 'time' ) ) # 数据刷新时间,单位:秒
        
    
        #获取所有节点
        # sections = conf.sections()
        # print(sections)
                
        code_list = conf.items(section = 'stock_code')
        stock_code_list = []
        for i in code_list:
            # print(i[1])
            stock_code_list.append(i[1])
        # print(stock_code_list)


        error_flag = None 
    except  Exception as e:
        error_flag = str(e)
        print(error_flag)
        stock_code_list = []


    ####################################################################
    
    # 创建窗口
    window = tk.Tk()
    ####################################################################
    # 如果config.ini 的[stock_code]部分键名重复则提示出错
    if error_flag != None:
        text = tk.Text(window, width=50, height=30, undo=True, autoseparators=False)
        text.pack()
        text.insert(tk.INSERT,error_flag)
        window.mainloop()
         
    ####################################################################

    

    attributes = conf.get( 'window', 'attributes' )
    
    if float(attributes) <= 0:  #预防config.ini设置窗口透明度小于等于0
        attributes = 1
    # print(float(attributes))
    window.attributes("-alpha",attributes)  #窗口透明度
    
    # window.config(background ="black") #窗口背景色
    window.wm_attributes('-topmost',1) #置顶窗口
    window.title('迷你信息')  # 标题
    fontsize=conf.get( 'window', 'fontsize' )#字体大小
    colwidth=conf.get( 'window', 'colwidth' )#列宽度
    bgcolor=conf.get( 'window', 'bgcolor' )#背景颜色
    font=conf.get( 'window', 'font' )#字体
    zhangcolor=conf.get( 'window', 'zhangcolor' )#涨颜色
    diecolor=conf.get( 'window', 'diecolor' )#跌颜色

    # 设置窗口大小变量
    
    # 数据列数 DataColumn ,默认 0:   显示4列
    # (可修改config.ini配置文件实现)
    # 0: 代码 + 名称 + 价格 + 涨跌
    # 1: 代码 + 价格 + 涨跌
    # 2: 名称 + 价格 + 涨跌
    # 3: 价格 + 涨跌
    DataColumn  =  conf.get( 'window', 'DataColumn' )
    if (DataColumn == '1' or DataColumn == '2'):
        width = 3*int(colwidth)
    elif DataColumn == '3':
        width = 2*int(colwidth)
    else:
        width = 4*int(colwidth)
             
    height = 19 * len(stock_code_list)


    window.resizable(width=True, height=False) # 窗口宽度固定,高度固定
    window.overrideredirect(True) #隐藏窗口

    # 窗口居中,获取屏幕尺寸以计算布局参数,使窗口居屏幕右下角
    screenwidth = window.winfo_screenwidth()
    screenheight = window.winfo_screenheight()
    size_geo = '%dx%d+%d+%d' % (width, height, (screenwidth-width), (screenheight-height)-40)
    window.geometry(size_geo)





    ####################################################################

    list_data1 = []
    list_data2 = []
    list_data3 = []
    list_data4 = []

    for i in stock_code_list:
        tick = get_realtime_data(i)
        try:                        # try excpt:  捕捉错误,然后提示
            list_data1.append(tick.symbol)
            list_data2.append(tick.name)
            list_data3.append(str(tick.price).center(10,' '))  
            list_data4.append(format(float(tick.percent)/100,'.2%'))
        except (AttributeError):
            list_data1.append('代码错误')
            list_data2.append(' ')
            list_data3.append(' ')
            list_data4.append(' ')
            
            
        
    ####################################################################


    if (DataColumn == '1'):
        #;1: 代码 + 价格 + 涨跌
        listbox1 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background =bgcolor
        listbox1.place(x=0)
        listbox3 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox3.place(x=colwidth)
        listbox4 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox4.place(x=int(colwidth)*2)
        for i,item in enumerate (list_data1):
            listbox1.insert(i,item)
        for i,item in enumerate (list_data3):
            listbox3.insert(i,item)
        for i,item in enumerate (list_data4):
            listbox4.insert(i,item)
            
    elif (DataColumn == '2'):
        #;2: 名称 + 价格 + 涨跌
        listbox2 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background =bgcolor
        listbox2.place(x=0)
        listbox3 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox3.place(x=colwidth)
        listbox4 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox4.place(x=int(colwidth)*2)
        for i,item in enumerate (list_data2):
            listbox2.insert(i,item)
        for i,item in enumerate (list_data3):
            listbox3.insert(i,item)
        for i,item in enumerate (list_data4):
            listbox4.insert(i,item)

    elif (DataColumn == '0'):
        # ;0: 代码 + 名称 + 价格 + 涨跌
        listbox1 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background =bgcolor
        listbox1.place(x=0)
        listbox2 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox2.place(x=colwidth) 
        listbox3 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox3.place(x=width*0.5)
        listbox4 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox4.place(x=width*0.75)
        
        for i,item in enumerate (list_data1):
            listbox1.insert(i,item)
        for i,item in enumerate (list_data2):
            listbox2.insert(i,item)
        for i,item in enumerate (list_data3):
            listbox3.insert(i,item)
        for i,item in enumerate (list_data4):
            listbox4.insert(i,item)
    else:
        # ;3: 价格 + 涨跌
        listbox3 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox3.place(x=0)
        listbox4 = tk.Listbox(window,width=int(colwidth),height=height,relief="ridge",background =bgcolor,font=(font,fontsize),border=0) # 底色 background ="lightgreen"
        listbox4.place(x=colwidth)
        for i,item in enumerate (list_data3):
            listbox3.insert(i,item)
        for i,item in enumerate (list_data4):
            listbox4.insert(i,item)








    
        
    ####################################################################

    t1 = threading.Thread(target=data_update,args=(stock_code_list,))  #更新数据
    t1.setDaemon(True)
    t1.start()

    ####################################################################
    
    # 创建右键退出菜单        
    menu = tk.Menu(window, tearoff=False)
    menu.add_command(label="重载",command = reload )
    menu.add_command(label="退出",command = window_off )

    def command(event):
        # 使用 post()在指定的位置显示弹出菜单
        menu.post(event.x_root, event.y_root)
    window.bind("<Button-3>", command)


    #################################

    # 隐藏主窗口,显示窗口
    def window_hide(event):
        window.withdraw()
    def window_show(event):
        window.deiconify()
        
    # 全局热键 Alt+1
    #window.bind("<Escape>",window_hide)
    keyboard.add_hotkey('alt+1', window_hide, args=('From global keystroke',))
    keyboard.add_hotkey('alt+2', window_show, args=('From global keystroke',))

    #################################

    def move_window(event):

        window.geometry('+{0}+{1}'.format(window.winfo_pointerx(),window.winfo_pointery()))
 
    # 鼠标拖动窗体
    window.bind("<B1-Motion>",move_window)

    ####################################################################
    window.mainloop()


config.ini内容

[C] 纯文本查看 复制代码
; 配置文件 config.ini
; 需要导入模块import configparser
; 谨慎修改



;代码列表 (首位字符代表 sh:上交所  sz:深交所  hk:港股) 
[stock_code]
; 键名 = 键值 (新增键名不要重复,否则报错)
stock_code5  = sz002733


; 窗体配置
[window]

; 透明度:0 - 1之间,
attributes = 0.5
;字体
font=宋体
;字体大小,默认10
fontsize=10
;列宽度,默认55
colwidth=55
;背景颜色 在线颜色工具https://www.sioe.cn/yingyong/yanse-rgb-16/
bgcolor=yellow
;涨显示颜色
zhangcolor=red
;跌显示颜色
diecolor=green


;数据刷新时间,单位:秒
time = 1


;数据列数DataColumn
;0: 代码 + 名称 + 价格 + 涨跌
;1: 代码 + 价格 + 涨跌
;2: 名称 + 价格 + 涨跌
;3: 价格 + 涨跌
DataColumn  =  3

            

[/mw_shl_code]
Dengghhui 发表于 2022-11-28 12:51
哈哈,这个好,上班必备神器~
pentium 发表于 2022-11-28 13:19
有源代码,支持感谢。
pengjingli 发表于 2022-11-28 14:28
请问一下,提示找不到指定模块:python39.dll,是怎么解决?
pengjingli 发表于 2022-11-28 14:29
还提示:计算机中丢失api-ms-win-core-path-|1-1-0.dell
pengjingli 发表于 2022-11-28 14:55
wrsg 发表于 2022-11-28 14:54
你的是不是win7系统? 我生成了win7版本

对对,是的,我的是win7系统
virs520 发表于 2022-11-28 15:03
感谢分享,插个眼 后面下载
 楼主| wrsg 发表于 2022-11-28 15:04
pengjingli 发表于 2022-11-28 14:28
请问一下,提示找不到指定模块:python39.dll,是怎么解决?

你试一下最新版本 main_v1.31.exe
 楼主| wrsg 发表于 2022-11-28 15:10
pentium 发表于 2022-11-28 13:19
有源代码,支持感谢。

快捷键你随意改
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 19:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表