Solomon Esenyi 2024-01-03
图形用户界面(GUI)为与计算机交互提供了直观的可视化前端。GUI 使用图标、窗口和菜单等视觉元素来提升用户体验和交互效率,而命令行界面(CLI)则依赖文本进行输入和输出操作。
Rust 近年来日益流行,这很可能归功于其灵活性和活跃的开源社区。开发者使用 Rust 进行系统设计、Web 开发以及构建 GUI 应用程序。Rust 生态中提供了大量用于开发快速、复杂 GUI 应用的包和 crate。
本文将回顾一些流行的 Rust GUI 库和框架,包括 Tauri、Druid、Xilem、Slint、gtk-rs、fltk-rs、iced、relm、Azul、egui 和 Yew。我们将对这些库进行比较,并讨论在何种情况下它们适合用于构建你的 GUI 应用程序。现在就开始吧!
Tauri
Tauri 是一个开源包,使开发者能够使用 Rust 创建轻量级、基于 Web 的桌面应用程序。
Tauri 利用 JavaScript、WebAssembly 以及其他 Web 技术,提供无缝的开发体验。该包提供了一个简单的 API,用于创建和自定义桌面应用,使开发者能够轻松构建可在 Windows、macOS 和 Linux 上运行的跨平台应用程序。
Tauri 的一个关键特性是其跨平台兼容性。借助 Tauri,你可以创建一个 GUI,并几乎无需修改即可在多个平台上运行,实现“一次构建,处处运行”的场景。
得益于其基于 Web 的架构,Tauri 应用程序轻量且快速。Tauri 基于 Web 技术构建,即使在低端硬件上也能流畅运行。
最后,Tauri 采用事件驱动架构,便于处理各种事件。它还提供对原生 API 的访问以及 JavaScript 互操作能力,使你能够从 Rust 代码中调用 JavaScript 函数。
将 Tauri 添加到你的项目非常简单:只需将其添加到项目根目录下 Cargo.toml 文件的依赖项部分:
[dependencies]
tauri = "0.9.0"
添加 Tauri 作为项目依赖后,你可以在 Rust 文件顶部通过以下代码导入它:
use tauri::{Builder, Tauri};
Druid
注意:Druid 的维护者已表示该项目将被弃用,转而支持基于相同原则的新项目,例如 Xilem(一种实验性的原生 Rust UI 框架,你可以在下一节了解更多内容)。
Druid 是一个强大且灵活的 Rust 库,用于构建桌面应用程序的 GUI。Druid 的一个关键特性是其布局系统,该系统基于约束条件实现直观的 widget 布局,使开发者能够轻松创建视觉一致且响应式的用户界面。
Druid 还提供大量内置 widget,包括按钮、标签和文本输入框等,可用于自定义应用程序的外观和风格。
Druid 具备跨平台兼容性,支持 Windows、macOS 和 Linux,允许你编写一次应用程序并在多个平台上无需修改即可运行。Druid 还提供全面的事件处理系统,便于实时响应用户交互并更新用户界面。
要开始使用 Druid 包,请在 cargo.toml 文件的依赖项中添加以下代码:
[dependencies]
druid = "0.7.0"
要在 Rust 文件中导入 Druid,请使用以下代码:
use druid::{AppLauncher, WindowDesc};
Xilem
Xilem 是一个受 SwiftUI、Flutter 和 Elm 等流行 UI 库启发的实验性 Rust UI 库。Xilem 的开发原则围绕性能和组织结构展开。
Xilem 轻量高效,因为它强调最小化更新。它使用集中式状态管理器来简化数据处理,同时提供可预测的更新机制。
如果你是熟悉 SwiftUI 的 Swift 开发者,应该会发现 Xilem 非常容易上手,因为其语法和概念与 SwiftUI 相似。
目前,该项目尚未发布任何正式版本;不过它正处于积极开发中。该项目在 GitHub 上已获得 2.3k 星标,对于一个新项目而言,这是相当令人印象深刻的成就。
Slint
Slint 是一个开源的、基于 Rust 的 UI 框架,用于构建原生用户界面。Slint 为嵌入式设备、微控制器和桌面应用程序提供了一套全面而简洁的解决方案。
Slint 的一个关键特性是其对多种编程语言的支持。开发者可以将基于 Slint 的 GUI 与使用 Rust、C++ 或 JavaScript 编写的后端逻辑相结合。此外,Slint 还提供大量预构建的 UI 组件,如按钮、表单、模态框等,使开发者无需从头构建这些组件。这些预构建组件也是可定制的,可根据应用程序的具体需求进行调整。
除了在不同屏幕尺寸上具有良好的响应性外,Slint 还支持跨操作系统和处理器架构。最后,Slint 提供了一套强大的 API,用于构建自定义组件。
要安装 Slint 包,请在 cargo.toml 文件的依赖项部分添加以下代码:
[dependencies]
slint = "1.0.2"
有多种方式可在 Rust 中引入 Slint 文件。最直接的方式是使用 slint! 宏内联 .slint 代码:
fn main() {
MainWindow::new().unwrap().run().unwrap();
}
slint::slint! {
export component MainWindow inherits Window {
Text {
text: "hello world";
color: green;
}
}
}
总体而言,Slint 是一个强大且多功能的解决方案,适用于使用 Rust 构建原生应用程序。其预构建组件、响应式设计和自定义组件 API 使其成为任何从事桌面和嵌入式项目的 Rust 开发者的宝贵工具。
gtk-rs
GTK 是由 GNOME 项目开发的一个流行的、跨平台的、面向对象的 widget 工具包。它被广泛用于构建可在 Unix、Windows 和 macOS 系统上运行的可移植 GUI 应用程序,并支持多种语言,包括 Python、JavaScript、C 和 Rust。
GTK 项目有多个版本,每个版本都有自己的变更和升级。
gtk-rs 项目为 GNOME 栈中的库(如 GTK 3 和 GTK 4)提供了安全的 Rust 绑定。gtk3-rs 和 gtk4-rs 库分别提供了 GTK 3 和 GTK 4 的功能。
要开始使用 gtk-rs 库,你需要安装 Rust 工具链和 GTK 库。创建项目后,在 Cargo.toml 文件中为 GTK 4 crate 添加以下依赖项:
gtk = { version = "X.X", package = "gtk4" }
如果你使用的是 macOS 或 Linux,可以使用 brew 包管理器安装 GTK 4 库:
brew install gtk4
有关在各种 Linux 发行版和 Windows 上的安装说明,请参阅相关页面。安装 GTK 4 并将其添加为依赖项后,你可以按如下方式导入该 crate:
use gtk::prelude::*;
use gtk::Application;
《gtk-rs 书》是一本学习如何使用该库在 Rust 中构建 GUI 的优秀资源。
在开发者社区中,GTK 库非常受欢迎;许多流行的 Linux GUI 应用程序都使用 GTK 库和 GNOME 栈。gtk-rs 库只是众多可用于生产的 Rust GUI 库之一。
fltk-rs crate
FLTK(Fast Light Toolkit)是一个轻量级、跨平台支持的 GUI 构建工具包。FLTK 支持 Windows、macOS 和 UNIX 系统,最初是为 C++ 构建的。如果你使用 FLTK 工具包创建 GUI 应用程序,该应用程序在所有支持的操作系统上看起来都是一致的。
fltk-rs 库为 FLTK 工具包提供了 Rust 绑定。fltk-rs crate 支持旧架构,提供超过 80 个可定制的 widget,以及四种以上支持的主题方案(包括 GTK 方案)。你还可以使用 fltk-theme crate 进行更多自定义。
fltk-rs 库安装、构建、启动和运行都非常迅速。要开始使用 fltk-rs crate,只需将其作为依赖项添加到 Cargo.toml 文件中,并在你的计算机上安装该库。
如果你使用的是 macOS 或 Linux 计算机,可以使用以下 brew 命令安装 fltk-rs 库:
brew install fltk
对于其他操作系统,你可以在文档中找到安装 fltk 库的说明。接下来,在 Cargo.toml 文件中将项目添加为依赖项:
[dependencies]
fltk = { version = "^1.3", features = ["fltk-bundled"] }
添加项目并安装库后,你可以按如下方式将其导入到项目中:
use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
请查阅 fltk-rs 文档 以详细了解其功能和用途。fltk 库非常受欢迎,截至撰写本文时,GitHub 上已有超过 1.4k 星标。它发展迅速,已发布 200 多个版本,你可以放心地在生产环境中使用该库。
iced
受 Elm 架构启发,iced-rs 是一个渲染器无关、功能齐全、以数据为中心的跨平台 Rust 库,用于构建 GUI 和前端。iced 提供了一种易于使用的响应式编程模型,并对异步操作和自定义 widget 提供一流支持。
使用 iced 库构建的 GUI 应用程序可在 Windows、macOS、Linux 以及 Web(使用 DOM)上运行,并具备响应式布局。iced 将应用程序划分为四个概念:
- State(状态):应用程序的状态
- Messages(消息):消息和事件
- View logic(视图逻辑):将状态显示为 widget 以供用户交互
- Update logic(更新逻辑):更新状态并处理消息
你可以轻松使用 iced 库构建前端 Web 应用程序。该过程与构建 GUI 应用程序类似,你可以查阅 iced 文档 以了解更多关于该包的信息。
由于其多功能性,iced 库是 Rust 中最受欢迎的库之一。然而,尽管已被许多项目采用,iced 仍有些不稳定,正处于快速发展阶段。但主分支不断变化,可能不适合在生产环境中使用,因此你可能需要考虑使用较旧的稳定版本。
你可以在 iced 仓库中找到用于灵感、代码示例和库实现的项目。
relm
relm 最初是用 Rust 编写的,是一个基于 GTK 的异步 GUI 库。它受 Elm 架构启发,旨在简化 GTK 库的使用,并提供类似 Elm 的体验。
与 GTK 库一样,你可以使用 relm 构建跨平台 GUI。你需要具备 GTK 库的使用经验,才能充分利用 relm 的功能。
要使用 relm,你需要在 Cargo.toml 文件中添加 GTK 和 relm 库作为依赖项。你还需安装 gtk 库:
[dependencies]
gtk = "0.9.0"
relm = "0.20.0"
relm-derive = "0.20.0"
最后,将 gtk crate 与 relm crate 一起导入:
use relm::{connect, Relm, Update, Widget};
use gtk::prelude::*;
use gtk::{Window, Inhibit, WindowType};
use relm_derive::Msg;
Rust 社区欣赏 relm 提供的 Elm 式体验,这种体验也由其他 Rust 库(如 Yew、Seed 和 iced)提供。
截至撰写本文时,relm 处于 beta 阶段,意味着它尚未经过充分测试且正在快速变化。因此,你可能暂时不希望在生产环境中使用它。
Azul 框架
Azul 是一个用于构建桌面 GUI 的响应式 GUI 框架,支持 Rust、C 和 C++。Azul 由 WebRender 驱动,采用类似 HTML 和 CSS 的文档对象模型(DOM)。由于 Azul 利用了 WebRender,它提供了渐变、盒阴影、边框样式和 CSS 变换等功能。
Azul 框架还提供大量内置 widget、每秒 60 帧以上的动画、跨平台原生对话框、SVG 解析、通过共享库实现的动态链接,以及 HTML 到 Rust 的编译以支持热重载。
要开始使用 Azul 框架,请将其添加到项目的依赖项中:
[dependencies]
azul = "1.0.0-alpha"
然后,将 crate 导入项目并使用:
use azul::prelude::*;
use azul::widgets::{button::Button, label::Label};
Azul 框架文档完善,可帮助你快速上手构建 GUI。
Azul 采用了不同于传统的方法进行 GUI 开发,截至目前,该框架已被用于 200 多个 Rust 项目。根据文档所述,该框架功能完整,可用于生产环境。
egui
egui 是一个即时模式(immediate-mode)、易于使用、可移植的 Rust 库,用于在 Web、计算机和游戏引擎中构建 GUI。egui 的目标是成为构建 Rust Web 应用程序最简单的库。
egui 提供安全、响应迅速、友好且可移植的 GUI 构建体验,无需回调且依赖极少。该项目拥有 WASM、WGPU、Winit 和 Glow 的官方集成,并有许多第三方集成可用于将 egui 与其他工具和引擎结合使用。
egui 的原生后端使用 glow,在 Windows 和 macOS 上运行良好。如果你使用的是 Linux,请执行以下命令以设置所需的后端:
sudo apt-get install -y libclang-dev libgtk-3-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev
然后,执行以下命令将 egui 添加为依赖项:
cargo add egui
你可以按如下方式导入 egui 以在项目中使用:
use eframe::egui;
egui 库正处于积极开发中,截至撰写本文时,已有 16 个版本发布,并在 GitHub 上获得超过 18k 星标。
Yew.rs
Yew.rs 是一个用于构建 Web 应用程序的 Rust WebAssembly 框架。它是一个基于组件的框架,简化了创建交互式 UI 的过程。Yew 提供了一个宏,用于声明包含 Rust 表达式的交互式 HTML,并支持在服务器端渲染 UI 以获得额外优势。
如果你有使用 React、Elm 和 JSX 等框架的经验,会发现 Yew 非常容易上手。虽然 Yew 主要用于构建 Web 应用程序的 UI,但其 WebAssembly 支持也允许你构建可在支持 WebAssembly 的设备上运行的 GUI。
要开始使用 Yew,请先为你的 Rust 项目开发环境添加 WASM 目标:
rustup target add wasm32-unknown-unknown
接下来,将 Yew 添加为项目依赖项:
[dependencies]
# 这是 Yew 的开发版本
yew = { git = "https://github.com/yewstack/yew/", features = ["csr"] }
现在你可以开始尝试这个框架了。访问 Yew 文档 以了解更多关于 Yew 的信息,以及如何利用它推进你的项目。
Yew 在 Rust 生态系统中家喻户晓;然而,它尚未发布任何稳定版本,因此在开发过程中你应做好因 API 破坏性变更而进行大规模重构的准备。在其 35 个版本中,Yew 已吸引超过 10.7k 用户,GitHub 星标接近 30k。
Rust GUI 库对比
本文讨论的 GUI 库各自提供不同的特性和功能。下表将帮助你在下一个项目中做出选择和权衡:
| GitHub 星标数(人气) | 项目用户数 | 兼容性 | 是否可用于生产 |
|---|---|---|---|
| gtk-rs | 1.5k | 1.4k | Windows, Linux, macOS |
| fltk-rs | 1.4k | 1k | Windows, Linux, macOS |
| iced | 21.6k | 2.9k | Windows, macOS, Linux, Web |
| relm | 2.4k | 未公开 | Windows, Linux, macOS |
| Azul | 5.7k | 未公开 | Windows, Linux, macOS |
| egui | 18k | 11.3k | Windows, macOS, Linux, Web |
| Tauri | 72.8k | 554 | macOS, Windows, Linux, Android, iOS |
| Slint | 12k | 544 | macOS, Windows, Linux, Android, iOS, Web |
| Druid | 9.2k | 2.1k | macOS, Windows, Linux/BSD, Web |
| Yew | 29.3k | 10.7k | Web/WebAssembly |
| Xilem | 2.3k | – | Linux |
Rust 生态系统中的许多 GUI 库相较于其他生态系统的同类项目仍处于早期阶段,尽管它们已具备许多优秀特性。在选择库时,请务必考虑其当前状态;使用未经充分测试的库存在风险。
你还应根据你要构建的内容以及项目运行的平台来考虑库的兼容性。建议在生产环境中使用任何库或工具之前,对其进行彻底测试和评估。
结论
Rust 生态系统中还有许多其他 GUI 库;你可以在 Are We GUI Yet 和 LibHunt 上找到全面的列表。在本教程中,我们探索了 Rust 生态系统中几个流行的 GUI 库,包括 Druid、Xilem、Slint、Tauri、gtk-rs、fltk-rs、iced、relm、Azul、egui 和 Yew。希望本教程能为你在下一个项目中选择最适合的 GUI 库提供一些见解!