首页/新闻资讯/正文详情

High Tide的UI是怎么做的:用Blueprint视觉DSL构建Libadwaita界面

发布时间:2026/11/4 11:23:17 来源:云帆数科 栏目:资讯中心
High Tide的UI是怎么做的:用Blueprint视觉DSL构建Libadwaita界面
【免费下载链接】high-tideLibadwaita TIDAL client for Linux项目地址https://gitcode.com/gh_mirrors/hi/high-tide点击查看免费下载High Tide 是一款运行在 Linux 上的 TIDAL 流媒体客户端它基于 Python GTK4 Libadwaita 开发。这套精致的界面并非用几百行 XML 手写的而是用 GNOME 官方的Blueprint视觉 DSL 描述——一种比 GTK Builder XML 简洁得多的界面语言编译后即可直接驱动 Libadwaita 组件。本文带你拆解 High Tide 的 UI 工程结构、Blueprint 核心语法和完整构建管线。![High Tide 播放界面展示 Blueprint 构建的 Libadwaita 双栏播放器布局](https://raw.gitcode.com/gh_mirrors/hi/high-tide/raw/c9f61b5d6e47c76594857a6f66ef759d7e7d4161/data/resources/screenshot 1.png?utm_sourcegitcode_repo_files)为什么选 Blueprint告别冗长的 GTK XML用 Python GTK 写界面时传统做法是维护.ui文件GTK Builder XML。XML 冗长、嵌套深、信号和属性绑定写得极其繁琐对新手极不友好。Blueprint 的思路是用缩进描述结构像写配置一样写界面。High Tide 的全部 UI 源码都放在 data/ui/ 目录按职责分为两类目录内容示例data/ui/pages_ui/页面级模板首页、搜索页、艺人页、曲目列表页page_template.blpdata/ui/widgets/可复用的界面组件lyrics_widget.blp、queue_widget.blp加上主窗口 window.blp、登录框 login.blp、偏好设置 preferences.blp 等共 21 个.blp文件就拼出了整个应用。![High Tide 歌词页界面由 lyrics_widget.blp 组件与双栏布局渲染](https://raw.gitcode.com/gh_mirrors/hi/high-tide/raw/c9f61b5d6e47c76594857a6f66ef759d7e7d4161/data/resources/screenshot 2.png?utm_sourcegitcode_repo_files)Blueprint 语法速览4 个核心能力打开 data/ui/window.blp会发现语法高度直观。1. 声明依赖的库文件开头声明要用哪些库类似 importusing Gtk 4.0; using Adw 1;2. 模板与命名子组件以template $类名:开头定义一个模板类名会被 Python 侧继承内部用下划线开头的名称给子组件起名便于代码访问template $HighTideWindow: Adw.ApplicationWindow { default-width: 800; default-height: 600; content: Adw.ToastOverlay toast_overlay { ... }; }3. 信号绑定一行连接回调按钮点击、滑块拖动等事件直接用挂到 Python 方法名上clicked $on_play_button_clicked();编译后GTK 会自动调用HighTideWindow类中定义的on_play_button_clicked()方法不需要手写任何connect代码。4. 属性绑定与 CSS 样式组件之间可以互相引用属性bind并直接挂 CSS 类名label: bind song_title_label.label; styles [ flat, ]这些 CSS 类如flat、card、pill、suggested-action最终对应 data/style.css 和 data/style-dark.css 中的自定义样式。在 DSL 中嵌入自定义 Python 组件High Tide 还有自研组件歌词、播放队列、曲目卡片等。Blueprint 用$前缀直接实例化 Python 注册过的自定义类型例如侧边栏的三个页签Adw.ViewStackPage { child: $HTLyricsWidget lyrics_widget { seek $on_seek_from_lyrics(); }; name: lyrics; title: _(Lyrics); }对应的 Python 类在 src/widgets/lyrics_widget.py 中定义并用GObject.type_register注册类型后Blueprint 编译期即可识别。响应式布局一套代码适配桌面与手机High Tide 最漂亮的界面技巧藏在 window.blp 里同一个文件同时描述了桌面和移动端两套布局。桌面布局使用Adw.OverlaySplitView左侧 35% 宽度的侧边栏放 Player/Lyrics/Queue 三个页签右侧是Adw.NavigationView内容区底部是 Home / Explore / Collection 导航条移动布局则换成Adw.BottomSheet底部抽屉式播放器主内容区向下留出 117 像素给迷你播放条。切换靠 Libadwaita 的断点机制窗口宽度小于 700sp 时自动切到mobile布局Adw.Breakpoint { condition (max-width: 700sp) setters { multilayout_view.layout-name: mobile; } }页面级模板如 tracks_list_template.blp里也有同样模式窄屏时封面缩小到 200px、标题居中、列表从横向改为纵向堆叠。也就是说响应式规则本身就是 Blueprint 的一等公民不用写任何 Python 判断代码。从 .blp 到 .ui构建管线拆解Blueprint 文件不能直接运行需要编译成 GTK Builder 能读的.uiXML。整条管线在 data/meson.build 中定义批量编译Meson 的custom_target调用blueprint-compiler batch-compile把 21 个.blp一次性编译为同名.ui文件资源打包编译产物按 data/high-tide.gresource.xml 清单打进 GResource 二进制资源包路径前缀为/io/github/nokse22/high-tide随应用一起安装运行时零文件查找工具来源编译工具来自 GNOME 官方的 blueprint-compiler 项目v0.12.0Nix 构建下作为原生构建输入声明在 flake.nix 中wrap 清单见 subprojects/blueprint-compiler.wrap。Python 侧如何接管界面编译只是把结构翻译好了行为仍由 Python 提供。每个界面对应一个继承 GTK/Adwaita 类的 Python 类用装饰器挂上资源路径Gtk.Template(resource_path/io/github/nokse22/high-tide/ui/window.ui) class HighTideWindow(Adw.ApplicationWindow): play_button Gtk.Template.Child() ...Gtk.Template告诉 GTK实例化该类时自动加载对应.ui文件Gtk.Template.Child()声明需要访问的命名子组件编译时 Blueprint 已把.blp中的命名节点生成为对应 ID声明的回调方法名与 Python 方法一一对应。主窗口逻辑全部集中在 src/window.py各组件歌词、队列、曲目卡片分别对应 src/widgets/ 下的同名文件。结构在 .blp行为在 .py两种职责互不干扰——这正是 High Tide UI 易读、易改的根本原因。总结High Tide UI 的技术要点DSL 优先21 个 Blueprint 文件替代了全部 XML界面即代码、可 diff、可 review组件化widgets/ 下的.blp是独立可复用组件配合$语法与 Python 自定义类无缝组合声明式响应式Adw.BreakpointAdw.MultiLayoutView让一套描述同时产出桌面双栏与移动底部抽屉布局⚙️清晰管线.blp → blueprint-compiler → .ui → GResource → Gtk.Template构建与运行时各司其职。对想在 Linux 上做 GTK 应用的朋友来说High Tide 的 data/ui/ 目录本身就是一份优秀的 Blueprint 实战教材从主窗口到小控件照着读一遍就能掌握这套视觉 DSL 的完整用法。赞分享【免费下载链接】high-tideLibadwaita TIDAL client for Linux项目地址https://gitcode.com/gh_mirrors/hi/high-tide点击查看免费下载相关推荐dsh-genui 是怎么做测试的E2E 视觉冒烟与 Sidechat 验收测试体系揭秘dsh genui 是怎么做测试的E2E 视觉冒烟与 Sidechat 验收测试体系揭秘 dsh genui 是 DeepSeek Harness 的 Gen行为测试指南用 Quick 验证“做什么”而不是“怎么做”行为测试指南用 Quick 验证“做什么”而不是“怎么做” 测试只有在应用程序 行为与预期不符 时才应该失败。测试应当验证应用代码 做了什么what 而测试开发工具Quick 行为测试指南验证应用做什么而不是怎么做Quick 行为测试指南验证应用做什么而不是怎么做 本文是 QuickThe Swift and Objective C testing fram测试开发工具上一篇终极Zellij错误码速查从崩溃到恢复的全景解决方案下一篇Get Jobs AI求职助手终极教程5步实现全平台简历自动投递创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

二进制文件分析与文件类型识别实战:Detect-It-Easy 文件格式检测完整指南
二进制文件分析与文件类型识别实战:Detect-It-Easy 文件格式检测完整指南

二进制文件分析与文件类型识别实战:Detect-It-Easy 文件格式检测完整指南 【免费下载链接】Detect-It-Easy Program for determining types of files for Windows, Linux and MacOS. 项目地址: https://gitcode.com/gh_mirrors/de/Detect-It-Easy 今天有人往… · 2026/11/4 11:23:17

Folia 歌词动画播放器安装与首跑指南:十分钟从下载到全屏歌词动效
Folia 歌词动画播放器安装与首跑指南:十分钟从下载到全屏歌词动效

Folia 歌词动画播放器安装与首跑指南:十分钟从下载到全屏歌词动效 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia 是一个基于… · 2026/11/4 11:23:17

Hermes Agent 配置与定制完全指南:5 步装好你的 AI 代理
Hermes Agent 配置与定制完全指南:5 步装好你的 AI 代理

Hermes Agent 配置与定制完全指南:5 步装好你的 AI 代理 刚装好的 AI 代理不好用:对话不记上下文,开发项目里又总想执行高危命令,每轮响应还慢、还贵。根源往往不在模型,而在配置。Hermes Agent 是一个会自我进化的开… · 2026/11/4 11:22:16

CS336 Learning(一) —— 分词器
CS336 Learning(一) —— 分词器

TL;DR BPE:自底向上合并,每一步只看相邻 token 对的频率,谁出现得多就合并谁,简单高效,GPT 系常用。WordPiece:同样自底向上合并,但决策依据换成似然增益(P(A,B) / (P(A)P(B))&… · 2026/11/4 12:11:01

从零手搓一个劳动法问答 RAG:LangChain + 本地向量库实战(零基础可跟)
从零手搓一个劳动法问答 RAG:LangChain + 本地向量库实战(零基础可跟)

一、先搞清楚:RAG 到底解决什么问题 直接问大模型"试用期最长多久",它可能答对,也可能一本正经地编造条文(幻觉)。 根源在于:大模型的知识是训练时"背"下来的,具体到某部法… · 2026/11/4 12:11:01

Ansys Mechanical 软件介绍
Ansys Mechanical 软件介绍

Ansys Mechanical 软件介绍Ansys Mechanical 是 Ansys 公司推出的一款面向结构工程的一流有限元分析(Finite Element Analysis,FEA)软件,内置结构、热、声学、瞬态与非线性等全谱系求解能力,广泛应用于航空航天、汽车、… · 2026/11/4 12:11:01

技术解析:资产评估基准日与无形资产出资的时效控制
技术解析:资产评估基准日与无形资产出资的时效控制

在企业以知识产权(专利、软著等)进行增资实缴的技术实操中,资产评估报告是核心文件。但很多项目在推进时,容易忽略一个关键变量:评估基准日。它不仅决定了资产的作价时点,更直接受到工商备案时效的约束。 一… · 2026/11/4 12:11:01

上千条快递查完不用手动数,用快递批量查询高手的查看方式功能查看所有单号,一键统计总单数
上千条快递查完不用手动数,用快递批量查询高手的查看方式功能查看所有单号,一键统计总单数

发货后最头疼的就是核对物流数据:上千条单号散落在表格里,要统计已签收单数、滞留在中转站的异常件数量,手动挨个点开物流官网核对,不仅要熬到半夜,还很容易数错漏数,导致异常件拖成客诉。其实完全不用这么… · 2026/11/4 12:11:01

深分页查询越来越慢,如何优化 LIMIT OFFSET
深分页查询越来越慢,如何优化 LIMIT OFFSET

深分页查询越来越慢,如何优化 LIMIT OFFSET 订单列表第一页打开很快,翻到第 5000 页却要好几秒。SQL 看起来只取了 20 条,LIMIT 100000, 20 里的 20 也很小,为什么还会慢?因为数据库并不是直接跳到第 100000 条&#x… · 2026/11/4 12:10:01

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码