feat: 今日实时 0% 画等号+金额小号 ¥/万,数值与状态栏数字加粗
- 环比/同比增长率恰为 0 时方向记 flat,三角位画等号(与用量行 pace 持平一致) - 金额拆为「¥ / 主数字 / 万」三段,¥ 与 万 用 F12 小号伪粗体、与 F24 主数字基线对齐;单量列不变 - 环比/同比数值、BTC 涨跌幅、顶部电量/温度/湿度数字改 F12 伪粗体(字号不变),占位 -- 不加粗 - 等号绘制抽为基类 _eq 供 pace 与环比/同比共用;网页版 flat 同样输出等号 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
51
renderer.py
51
renderer.py
@@ -108,8 +108,8 @@ class DashboardRenderer:
|
||||
"""环比/同比一行的总宽度(标签 + 间隙 + 三角 + 数值),供居中/右对齐排布。"""
|
||||
direction, val = pair
|
||||
k = self.k
|
||||
trw, tgap = (8 * k, 4 * k) if direction else (0, 0)
|
||||
return self._tw(label, self.F12) + 5 * k + trw + tgap + self._tw(val, self.F12)
|
||||
trw, tgap, vb = (8 * k, 4 * k, k) if direction else (0, 0, 0) # vb:数值伪粗体的偏移宽度(占位 -- 不加粗)
|
||||
return self._tw(label, self.F12) + 5 * k + trw + tgap + self._tw(val, self.F12) + vb
|
||||
|
||||
def _cmp_line(self, cx, y, label, pair, fg=BLACK):
|
||||
"""环比/同比一行:标签 + 涨跌三角 + 数值,整体居中于 cx。direction 为 None 时不画三角。"""
|
||||
@@ -119,20 +119,49 @@ class DashboardRenderer:
|
||||
"""环比/同比「三角 + 数值」的颜色钩子:三色版 涨红、其余沿用 fg。宽版覆写。"""
|
||||
return RED if direction == "up" else fg
|
||||
|
||||
def _eq(self, cx, cy, w, fill=BLACK):
|
||||
"""等号「=」:两道横杠各宽 w、厚 k,中间隔 2k,整体以 (cx, cy) 为中心——占三角的位子表示「持平」。
|
||||
用量行 pace(diff=0)与今日实时环比/同比(增长率恰为 0)共用。"""
|
||||
k = self.k
|
||||
for top in (cy - 2 * k, cy + k):
|
||||
self.d.rectangle([cx - w / 2, top, cx + w / 2 - 1, top + k - 1], fill=fill)
|
||||
|
||||
def _cmp_at(self, x, y, label, pair, fg=BLACK):
|
||||
"""环比/同比一行,左对齐于 x(宽版把它放在数值右侧时用)。"""
|
||||
"""环比/同比一行,左对齐于 x(宽版把它放在数值右侧时用)。
|
||||
direction: up 上三角 / down 下三角 / flat 等号(增长率恰为 0,2026-09-14 用户要求,原来 0 也画上三角)/ None 不画。"""
|
||||
direction, val = pair
|
||||
k = self.k
|
||||
lw = self._tw(label, self.F12); gap = 5 * k
|
||||
trw, tgap = (8 * k, 4 * k) if direction else (0, 0)
|
||||
self.text(x, y, label, self.F12, fill=fg); x += lw + gap
|
||||
# 方向语义配色由 _cmp_color 决定(三色版:红涨、跌/无 → 黑;宽版覆写为 涨绿跌红 与 K 线一致);标签始终黑
|
||||
up = direction == "up"
|
||||
# 方向语义配色由 _cmp_color 决定(三色版:红涨、跌/无/持平 → 黑;宽版覆写为 涨绿跌红 与 K 线一致);标签始终黑
|
||||
val_color = self._cmp_color(direction, fg)
|
||||
if direction:
|
||||
if direction == "flat":
|
||||
self._eq(x + trw / 2, y + 8 * k, 7 * k, fill=val_color); x += trw + tgap # 横杠落在第 6/9 行,中心 8 ≈ 数字墨迹中心 8.5
|
||||
elif direction:
|
||||
# 三角中心对齐 F12 数字墨迹竖直中心(y+8.5),否则箭头偏高
|
||||
self.tri(x + trw / 2, y + 8.5 * k, 7 * k, up=up, fill=val_color); x += trw + tgap
|
||||
self.text(x, y, val, self.F12, fill=val_color)
|
||||
self.tri(x + trw / 2, y + 8.5 * k, 7 * k, up=direction == "up", fill=val_color); x += trw + tgap
|
||||
# 数值伪粗体、字号不变(2026-09-14 用户要求);标签常规字重;占位「--」不加粗(加粗会粘成一条长横)
|
||||
self.text(x, y, val, self.F12, fill=val_color, bold=k if direction else 0)
|
||||
|
||||
def _value(self, cx, y, col, bold=1):
|
||||
"""今日实时的数值:主数字 F24 粗,前缀(¥)/后缀(万)F12 小号、与主数字基线对齐(2026-09-14 用户要求「¥ 与 万 字号小一点」),
|
||||
整体水平居中于 cx。col["vp"] 为 (前缀, 主数字, 后缀),缺失时退回整串 col["v"] 按 F24 画。"""
|
||||
pre, num, suf = col.get("vp") or ("", col["v"], "")
|
||||
k = self.k
|
||||
GAP = 1 * k # 小号段与主数字的间距
|
||||
sb = bold # 小号段同样伪粗体,否则挨着粗体主数字显得单薄
|
||||
wp = self._tw(pre, self.F12) + sb + GAP if pre else 0
|
||||
ws = GAP + self._tw(suf, self.F12) + sb if suf else 0
|
||||
wn = self._tw(num, self.F24) + bold
|
||||
x = cx - (wp + wn + ws) / 2.0
|
||||
# 基线对齐:F12/F24 数字墨迹底沿分别为 13k/26k(getbbox),小号段下移其差值
|
||||
ys = y + (self.F24.getbbox("0")[3] - self.F12.getbbox("0")[3])
|
||||
if pre:
|
||||
self.text(x, ys, pre, self.F12, bold=sb); x += wp
|
||||
self.text(x, y, num, self.F24, bold=bold); x += wn
|
||||
if suf:
|
||||
self.text(x + GAP, ys, suf, self.F12, bold=sb)
|
||||
|
||||
def _label(self, y, title, right=None, x0=None, x1=None):
|
||||
"""区块标题(两区块统一,对齐主分支 _title_bar 风格):
|
||||
@@ -174,9 +203,7 @@ class DashboardRenderer:
|
||||
if diff != 0:
|
||||
self.tri(cx, cy, TRI, up=up, fill=color)
|
||||
else:
|
||||
k = self.k # 等号「=」:两道横杠,各宽 6k、厚 k,中间隔 2k,整体以 cy 为中心
|
||||
for top in (cy - 2 * k, cy + k):
|
||||
self.d.rectangle([cx - TRI / 2, top, cx + TRI / 2 - 1, top + k - 1], fill=color)
|
||||
self._eq(cx, cy, TRI, fill=color) # 等号与三角等宽
|
||||
return tw + TRI_GAP + TRI
|
||||
|
||||
def _usage_row(self, x0, x1, y, bar, warn, label_w=None):
|
||||
@@ -477,7 +504,7 @@ class DashboardRenderer:
|
||||
for i, c in enumerate(cols):
|
||||
cx = ax0 + cw * (i + 0.5)
|
||||
self.ctext(cx, 211, c["k"], self.F12) # 指标名(标题+18)
|
||||
self.ctext(cx, 227, c["v"], self.F24, bold=1) # 数值 伪粗体(+34)
|
||||
self._value(cx, 227, c, bold=1) # 数值 F24 伪粗体 + 小号 ¥/万(+34)
|
||||
self._cmp_line(cx, 257, "环比", c["hb"]) # +64
|
||||
self._cmp_line(cx, 275, "同比", c["tb"]) # +82,墨迹止于≈289,底部留≈10px
|
||||
|
||||
|
||||
Reference in New Issue
Block a user