feat(EDID-Viewer): v0.1.0 入库 — Fluent EDID 查看器,目录对齐 DLPilot
- src/ 人写代码:main.py(Fluent 界面、Light/Dark/dark1/dark2/跟随系统主题、 关于按钮;主题三件套 = setTheme + QPalette/应用级 QSS + DWM 标题栏, 修复 Light 下窗口背景/页签/标题栏仍为系统深色的问题)、edid.py (EDID/CTA/HDMI/HDR 解析)、windows_edid.py(WMI 只读)、theme.py、 test_edid.py(9 项解析测试,含随机畸形数据无崩溃检查) - assets/ 图标与生成脚本;release/ 交付:EDID-Viewer.exe(onefile 63.7MB, 启动/图标/主题已验证)+ README,与 DLPilot/release 同约定 exe 直接入库 - 流水线对齐 DLPilot:src/build_exe.py(spec 由脚本生成不入库,剔除 PATH 上 Poppler/Conda 版本化 ICU,避免 QtCore 报 WinError 127)→ package_release.py(组装 EDID-Viewer-v*-win64.zip,zip 只上传 Gitea)→ publish_gitea.py(token 走 GITEA_TOKEN,自签证书 --insecure) - agent.md 更名 AGENTS.md(DLPilot 双文档约定:README 给人 / AGENTS.md 给 Agent);根 .gitignore 增加 EDID-viewer/release/*.zip - validation/ 保留 EDID 本机/合成样本与窗口截图、关于对话框自检脚本
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
"""Headless check for the About button and dialog: saves header and dialog PNGs."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
from PySide6.QtCore import QTimer
|
||||
from PySide6.QtGui import QFont
|
||||
from PySide6.QtWidgets import QApplication, QMessageBox
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src"))
|
||||
import main as m
|
||||
|
||||
OUT = Path(__file__).resolve().parent
|
||||
|
||||
|
||||
def snap_dialog():
|
||||
boxes = [w for w in QApplication.topLevelWidgets() if isinstance(w, QMessageBox)]
|
||||
if not boxes:
|
||||
QTimer.singleShot(200, snap_dialog)
|
||||
return
|
||||
boxes[0].grab().save(str(OUT / "about-dialog.png"))
|
||||
boxes[0].close()
|
||||
|
||||
|
||||
def open_about(window):
|
||||
QTimer.singleShot(600, lambda: snap_dialog())
|
||||
window.show_about()
|
||||
|
||||
|
||||
def main():
|
||||
app = QApplication(sys.argv)
|
||||
app.setApplicationName(m.APP_NAME)
|
||||
app.setFont(QFont("Microsoft YaHei UI", 10))
|
||||
theme_manager = m.ThemeManager(app)
|
||||
window = m.Window(theme_manager)
|
||||
window.show()
|
||||
|
||||
def grab_header():
|
||||
window.grab().save(str(OUT / "about-header.png"))
|
||||
open_about(window)
|
||||
|
||||
QTimer.singleShot(1500, grab_header)
|
||||
QTimer.singleShot(6000, app.quit)
|
||||
sys.exit(app.exec())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,30 @@
|
||||
param(
|
||||
[string]$ProcessName = "python",
|
||||
[string]$OutPng = "$env:TEMP\edid-window.png"
|
||||
)
|
||||
Add-Type @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
public class Win32Cap {
|
||||
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
|
||||
[DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h);
|
||||
public struct RECT { public int Left, Top, Right, Bottom; }
|
||||
}
|
||||
"@
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
$proc = Get-Process -Name $ProcessName -ErrorAction Stop |
|
||||
Where-Object { $_.MainWindowHandle -ne 0 -and $_.MainWindowTitle -like 'EDID*' } |
|
||||
Select-Object -First 1
|
||||
if (-not $proc) { throw "no EDID window found for process '$ProcessName'" }
|
||||
$hwnd = $proc.MainWindowHandle
|
||||
[Win32Cap]::SetForegroundWindow($hwnd) | Out-Null
|
||||
Start-Sleep -Milliseconds 800
|
||||
$r = New-Object Win32Cap+RECT
|
||||
[Win32Cap]::GetWindowRect($hwnd, [ref]$r) | Out-Null
|
||||
$w = $r.Right - $r.Left; $h2 = $r.Bottom - $r.Top
|
||||
$bmp = New-Object System.Drawing.Bitmap($w, $h2)
|
||||
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||
$g.CopyFromScreen($r.Left, $r.Top, 0, 0, (New-Object System.Drawing.Size($w, $h2)))
|
||||
$bmp.Save($OutPng, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||
$g.Dispose(); $bmp.Dispose()
|
||||
Write-Output "saved $OutPng ($w x $h2)"
|
||||
Binary file not shown.
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"instance": "DISPLAY\\SDC420B\\4&1387f127&0&UID8388688_0",
|
||||
"connection": 2147483648,
|
||||
"error": "常规故障 ",
|
||||
"连接": "内部显示",
|
||||
"基本信息": {
|
||||
"厂家 PNP 代码": "SDC",
|
||||
"产品编号": "0x420B",
|
||||
"数字序列号": 0,
|
||||
"EDID 版本": "1.4",
|
||||
"生产日期": "2024 年 / 周未指定",
|
||||
"尺寸": "34 × 22 cm",
|
||||
"Gamma": 2.2,
|
||||
"扩展块数": 2,
|
||||
"SHA-256": "16f168eda782b8d49c3ef5cdf46cb894c353c6ef2570629707b72a0cdefb9584",
|
||||
"输入类型": "数字",
|
||||
"接口声明": "DisplayPort",
|
||||
"色深 bpc": 10,
|
||||
"频率范围原始值": "垂直 48–240 Hz;水平 177–177 kHz;最大像素时钟 1170 MHz",
|
||||
"描述文本": "SDC",
|
||||
"显示器名称": "ATNA60HU01-0"
|
||||
},
|
||||
"时序": [],
|
||||
"能力": [
|
||||
"色度坐标:Rx=0.6807, Ry=0.3184, Gx=0.2197, Gy=0.7246, Bx=0.1426, By=0.0391, Wx=0.3135, Wy=0.3291"
|
||||
],
|
||||
"数据块": [
|
||||
{
|
||||
"块": 1,
|
||||
"类型": "DisplayID(暂未解码)",
|
||||
"原始": "70 20 79 02 00 20 00 0c ba 41 59 0b 42 00 00 00 00 00 18 00 21 00 1d 74 0d 69 08 00 0a 40 06 00 e5 7a 51 85 a3 b9 4a 02 0a 02 45 54 d0 5f 4c 64 00 45 23 78 26 00 09 06 00 00 00 00 00 50 00 00 22 00 28 80 c5 11 85 ff 09 87 00 07 00 1f 00 3f 06 c7 00 7f 00 07 00 80 c5 11 05 ff 09 87 00 07 00 1f 00 3f 06 df 15 97 15 07 00 81 00 0b e3 05 80 00 e6 06 05 01 8f 6a 02 00 00 00 00 00 f1 90"
|
||||
}
|
||||
],
|
||||
"校验": [
|
||||
"块 0: 通过",
|
||||
"块 1: 通过"
|
||||
],
|
||||
"警告": [
|
||||
"声明 384 字节,实际 256 字节",
|
||||
"范围描述符有扩展偏移,频率范围显示原始字段,暂未应用偏移"
|
||||
]
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1 @@
|
||||
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x4C, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3A, 0x80, 0x18, 0x71, 0x38, 0x2D, 0x40, 0x58, 0x2C, 0x45, 0x00, 0xFD, 0x1E, 0x11, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x54, 0x45, 0x53, 0x54, 0x20, 0x50, 0x41, 0x4E, 0x45, 0x4C, 0x0A, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC2, 0x02, 0x03, 0x17, 0x70, 0x42, 0x90, 0x61, 0x23, 0x09, 0x07, 0x07, 0x67, 0x03, 0x0C, 0x00, 0x12, 0x34, 0x30, 0x78, 0xE3, 0x06, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD
|
||||
Reference in New Issue
Block a user