0x00 开篇
上周我们写了一个短视频解析小工具,但是运行起来是一个“黑框”,那本篇文章将介绍一个 Rust 的 GUI 框架来给这个小工具“穿上衣服”。本篇文章涉及到的 GUI 框架是 Tauri
和FLTK-rs
。我先会做一个简单的入门介绍,然后再使用它们来包装这个短视频解析的小工具。本文并不会详细介绍 Tauri
和 FLTK-rs
的使用教程。其实 Rust 到目前为止已经出现很多 GUI 框架了,还有 iced
等等。本篇文章的阅读时间大约 12 分钟。
0x01 认识 Tauri
Tauri
类似于 Electron
,但是 Tauri
使用系统自带的网页渲染器,没有将 chromium
打进包内,所以打出包大小的体积非常小。在 Windows
上 Tauri
基于 Microsoft Edge
和 Chromium
的 WebView2
(Windows 11预装,Windows 10 最新版已预装,Windows 7 可以额外下载运行时)。在Linux
和 macOS
上使用的是 WebKit
。
Tauri
的界面使用 Html
、js
、css
来构建,支持 Vue
、React
等框架。具体的业务实现逻辑使用 Rust
来构建。
0x02 创建 Tauri 项目
准备工作
- 系统:Windows 11 64位
- WebView2:系统预装
- pnpm
- rust
- VSCode
创建项目
通过命令 pnpm create tauri-app
创建项目。
我这里习惯选择了 vue-ts
UI 模板,可以根据自己的喜好来选择。最终项目目录如下:
然后执行命令pnpm install
安装依赖,使用命令pnpm tauri dev
就是运行项目了。首次编译项目会非常慢。
在 Rust 的 main.rs
中,我们所有给前端页面的接口都需要通过tauri::generate_handler!
来"注册"。
tauri::Builder::default() .invoke_handler(tauri::generate_handler![get_dy_info]) .run(tauri::generate_context!()) .expect("error while running tauri application");
前端页面需要使用 invoke()
方法来调用 Rust 的函数。注意:所有给前端的 Rust 函数都是异步返回的。
let info = await invoke("get_dy_info", { input: input.value })
我们将上一篇文章的源码稍微改动下。
Coding中...请等待...
最终效果
打包分发
首先我们要先修改tauri.conf.json
中的 identifier,
改为 com.tauri.build
,然后执行命令
pnpm tauri build
。
首次构建会下载 wix
。当然还可以对安装包进行一些自定义的优化,详见官方文档。另外,Tauri
暂不支持 portable
模式,俗称绿色版。
0x03 认识 FLTK-rs
再来了解下另一个 GUI 框架。FLTK (The Fast Light Tool Kit)是一个跨平台的轻量级GUI库,支持 Linux、Windows、MacOS。如果你觉得 Tauri
有点重或者是不熟悉前端语法,那我推荐你使用这个库,使用起来也非常简单,仅仅导入一个 crate
就可以了。
fltk = { version = "1.3.19", features = ["fltk-bundled"] }
0x04 使用 fltk-rs
简单使用
几行代码,一个窗口就可以创建。下面的代码就是创建一个窗口了。
use fltk::{app, prelude::*, window::Window}; fn main() { let app = app::App::default(); let mut wind = Window::new(100, 100, 800, 300, "hello Rust!"); wind.end(); wind.show(); app.run().unwrap(); }
移植代码,Coding中...请等待...
最终效果
说实话除了丑一点,其它还好。
0x05 小结
本篇文章主要来探讨 Rust GUI 框架目前的可行性。在桌面跨平台 GUI 方便,目前面对Flutter
、electron
等框架,Rust 还有很长的路要走。如果目前真需要用 Rust 做一些小工具,我推荐使用 tauri
。
0x06 参考资料
Tauri 官方文档:https://tauri.app/zh-cn/v1/guides/