股价展示程序生成

SKILL开发
开发 未标注权限 许可证不明确
安装这个技能

构建 Windows 任务栏覆盖式小组件,使用 Python + tkinter + pystray 显示实时数据(股票价格、系统指标、通知等)。当用户需要创建桌面小组件、任务栏浮窗、系统托盘工具、实时行情显示、状态栏挂件时使用。触发关键词:任务栏小组件、系统托盘、桌面浮窗、实时显示、股票小组件、状态栏挂件、taskbar widget、system tray overlay。

一句话选型结论

按资料字段整理

股价展示程序生成是开发类的 Agent Skill,安装方式未标注,权限级别未标注,许可证不明确,有可直接复制的安装命令。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类开发 安装方式未标注 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 未标注
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

未标注
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
skillhub install user_c641d7bd/windows-taskbar-widget
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    执行上面的命令安装;也可以把仓库里的 SKILL.md 手动放进客户端的 skills 目录。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

开发
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方user_c641d7bd仓库 未标注 · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式未标注安装包 community
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 1791737675
正文体量7.7 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
写代码与改 bug

按需求补代码、定位并修掉报错。

读仓库与生成改动

让模型读懂项目结构,再给出可落地的改动。

跑测试与排查故障

按现象排查问题,补测试用例并复跑。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在开发场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
股价展示程序生成当前 未标注权限 未标注 未标注 未标注 有
技能审查员 浏览器控制 ClawHub 市场 877.9 万 OpenClaw 有
Vercel React 最佳实践 浏览器控制 GitHub 仓库 849.1 万 Codex、Claude、Cursor 有
GitHub 代码协作 联网访问 ClawHub 市场 763.3 万 OpenClaw 有
网页设计指南 联网访问 GitHub 仓库 668.6 万 Codex、Claude、Cursor 有
本体论 只读 ClawHub 市场 663.7 万 OpenClaw 有

SKILL.md 全文

7.7 KB
模型实际读到的说明书原文,来自技能仓库

Windows 任务栏覆盖式小组件

构建紧凑的无边框置顶窗口,停靠在 Windows 任务栏上方,同时在系统托盘区域显示图标,用于展示实时数据。

技术栈

  • Python 3.10+,tkinter(内置 GUI)
  • pystray + Pillow(系统托盘图标)
  • requests(HTTP API 请求)
  • PyInstaller(打包为单个 exe)
pip install requests pystray Pillow pyinstaller

架构概览

main.py
  ├── 配置层          — JSON 持久化存储,代码标准化
  ├── 数据层          — 调用实时 API(新浪/腾讯/自定义)
  ├── GUI 层          — tkinter 无边框浮窗 + 右键菜单
  │   ├── 主浮窗       — 置顶、可拖拽、显示实时数据
  │   └── 设置弹窗     — Toplevel 模态对话框
  ├── 托盘图标层      — pystray 系统托盘图标(显示价格+右键退出)
  └── 后台刷新循环    — threading.Thread 守护线程,定时刷新

构建步骤

1. 无边框浮窗

root = tk.Tk()
root.overrideredirect(True)       # 无标题栏和边框
root.attributes("-topmost", True) # 始终置顶
root.attributes("-alpha", 0.92)   # 轻微透明
root.configure(bg="#1A1A1A")      # 深色背景

2. 定位到任务栏上方

使用 ctypes + Windows API 获取任务栏高度:

import ctypes
import ctypes.wintypes   # 必须显式导入,否则 exe 打包后报错

def get_taskbar_height():
    user32 = ctypes.windll.user32
    work_area = ctypes.wintypes.RECT()
    user32.SystemParametersInfoW(0x0030, 0, ctypes.byref(work_area), 0)
    screen_h = user32.GetSystemMetrics(1)
    return screen_h - (work_area.bottom - work_area.top)

def get_screen_size():
    user32 = ctypes.windll.user32
    return user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

定位到屏幕右下角、任务栏上方:

sw, sh = get_screen_size()
taskbar_h = get_taskbar_height()
x = sw - win_w - 160   # 右偏移 160px,避开系统托盘图标区
y = sh - taskbar_h - win_h - 2
root.geometry(f"+{x}+{y}")

3. 拖拽支持

def on_press(event):
    self._drag_x = event.x
    self._drag_y = event.y

def on_drag(event):
    x = root.winfo_x() + event.x - self._drag_x
    y = root.winfo_y() + event.y - self._drag_y
    root.geometry(f"+{x}+{y}")

root.bind("<Button-1>", on_press)
root.bind("<B1-Motion>", on_drag)

4. 右键菜单

def on_right_click(event):
    menu = tk.Menu(root, tearoff=0)
    # 关键:用 root.after(150, ...) 延迟打开设置弹窗
    menu.add_command(label="设置", command=lambda: root.after(150, open_settings))
    menu.add_command(label="刷新", command=refresh_data)
    menu.add_separator()
    menu.add_command(label="退出", command=root.destroy)
    menu.tk_popup(event.x_root, event.y_root)

关键细节:必须使用 root.after(150, callback) 延迟打开设置弹窗,确保右键菜单完全关闭后再弹出对话框,避免焦点冲突。

5. 设置弹窗(Toplevel)

def open_settings():
    # 防止重复打开多个弹窗
    if self._settings_dlg is not None:
        try:
            self._settings_dlg.focus_force()
            return
        except tk.TclError:
            self._settings_dlg = None

    dlg = tk.Toplevel(root)
    self._settings_dlg = dlg
    dlg.title("设置")
    dlg.configure(bg="#1A1A1A")
    dlg.attributes("-topmost", True)
    dlg.attributes("-alpha", 1.0)   # 关键:覆盖父窗口的透明度!
    dlg.resizable(False, False)
    dlg.protocol("WM_DELETE_WINDOW", on_close)

Toplevel 弹窗必守规则:

规则 原因
dlg.attributes("-alpha", 1.0) Toplevel 会继承父窗口的 -alpha,导致弹窗背景透视
self._settings_dlg 守卫变量 防止用户多次点击后弹窗层叠冲突
dlg.protocol("WM_DELETE_WINDOW", on_close) 确保用户点标题栏 × 时正确清理引用
dlg.after(200, entry.focus_force) 延迟聚焦——窗口必须完全渲染后才能接收输入
不要对弹窗使用 overrideredirect(True) 会同时去掉标题栏和键盘输入能力

6. 系统托盘图标(pystray)

使用 Pillow 动态生成价格图标,pystray 在独立线程运行:

from PIL import Image, ImageDraw, ImageFont
import pystray

def create_tray_image(price, change_pct):
    """生成 64x64 托盘图标"""
    img = Image.new("RGBA", (64, 64), (40, 40, 40, 255))
    draw = ImageDraw.Draw(img)
    # 根据涨跌选择颜色:红涨绿跌
    color = (220, 50, 50) if change_pct and change_pct > 0 \
       else (50, 180, 50) if change_pct and change_pct < 0 \
       else (255, 255, 255)
    # 绘制价格文字和涨跌幅(省略细节,见 reference_template.py)
    return img

# 在独立线程启动托盘图标
tray = pystray.Icon("widget", icon=initial_img, title="加载中...",
                    menu=pystray.Menu(pystray.MenuItem("退出", on_quit)))
threading.Thread(target=tray.run, daemon=True).start()

刷新数据时同步更新托盘图标:

tray.icon = create_tray_image(price, change_pct)
tray.title = f"{code} | 现价: {price:.3f} | 涨跌: {pct:+.2f}%"

7. 后台数据刷新

import threading, time

def bg_loop():
    while True:
        root.after(0, update_display)   # 在主线程执行 UI 更新
        time.sleep(REFRESH_INTERVAL)

t = threading.Thread(target=bg_loop, daemon=True)
t.start()
root.mainloop()

8. 配置持久化

JSON 配置文件存储在 exe 同目录:

import os, sys, json

CONFIG_PATH = os.path.join(
    os.path.dirname(sys.executable if getattr(sys, "frozen", False) else __file__),
    "config.json"
)

9. 新浪财经 API(股票行情)

HEADERS = {
    "Referer": "https://finance.sina.com.cn",
    "User-Agent": "Mozilla/5.0 ..."
}
url = f"https://hq.sinajs.cn/list={stock_code}"  # 如 sz159516, sh600519
resp = requests.get(url, headers=HEADERS, timeout=5)
resp.encoding = "gbk"
# 解析: var hq_str_sz159516="名称,今开,昨收,现价,最高,最低,..."
# 字段: [0]名称 [1]今开 [2]昨收 [3]当前价格

股票代码标准化规则:6xxxxx/9xxxxx → 上海(sh前缀),其余 → 深圳(sz前缀)。

打包发布

pyinstaller --onefile --noconsole --name WidgetName main.py

--noconsole 隐藏控制台窗口。输出位于 dist/WidgetName.exe。

已知踩坑记录

坑点 现象 修复方案
缺少 ctypes.wintypes 导入 AttributeError: module 'ctypes' has no attribute 'wintypes' 显式写 import ctypes.wintypes
Toplevel 继承 -alpha 设置弹窗背景透视,能看到桌面内容 设置 dlg.attributes("-alpha", 1.0)
弹窗使用 overrideredirect Entry 输入框无法接收键盘输入 弹窗不要用 overrideredirect
菜单直接打开弹窗 第一次点击无效,第二次才生效 使用 root.after(150, callback) 延迟
无重复弹窗守卫 多个设置弹窗层叠冲突 用 self._settings_dlg 追踪实例
focus_force 过早调用 聚焦静默失败,输入框不工作 用 dlg.after(200, ...) 延迟

完整模板

参见 reference_template.py,包含完整的可运行代码模板。

常见问题

5 问
答案由本站依据条目字段整理
股价展示程序生成怎么安装?

在支持 Skills 的客户端里执行:skillhub install user_c641d7bd/windows-taskbar-widget。安装方式为未标注。装完刷新技能列表或重开客户端。

股价展示程序生成支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

股价展示程序生成权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

股价展示程序生成收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

股价展示程序生成用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。