Rust GUI 库的现状

更新于 2026-01-17

Solomon Esenyi 2024-01-03

图形用户界面(GUI)为与计算机交互提供了直观的可视化前端。GUI 使用图标、窗口和菜单等视觉元素来提升用户体验和交互效率,而命令行界面(CLI)则依赖文本进行输入和输出操作。

Rust 近年来日益流行,这很可能归功于其灵活性和活跃的开源社区。开发者使用 Rust 进行系统设计、Web 开发以及构建 GUI 应用程序。Rust 生态中提供了大量用于开发快速、复杂 GUI 应用的包和 crate。

本文将回顾一些流行的 Rust GUI 库和框架,包括 TauriDruidXilemSlintgtk-rsfltk-rsicedrelmAzuleguiYew。我们将对这些库进行比较,并讨论在何种情况下它们适合用于构建你的 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-rsgtk4-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 YetLibHunt 上找到全面的列表。在本教程中,我们探索了 Rust 生态系统中几个流行的 GUI 库,包括 DruidXilemSlintTaurigtk-rsfltk-rsicedrelmAzuleguiYew。希望本教程能为你在下一个项目中选择最适合的 GUI 库提供一些见解!