Rust GUI 编程漫谈:超越 Web 与原生 GUI
自打我有了一个写 Uncode IDE 的小目标之后,我开始寻找一些适用于 Rust 语言的 GUI 框架。对于未来而言,基于 Rust 语言写 GUI 提供了大量的优点。
浏览器环境。在进程分离的架构下,意味着我们可以用 Rust 写 GUI 后端,用于提供语言服务等;Rust 写前端则可以编译为 WebAssembly,以更好的性能在浏览器上运行。
本地运行。没啥说的,怎么地也不如再有的 GUI 框架做得好。
移动设备上运行。就是想想,说不定还能实现。
于是,在我这一个月的努力之下,我尝试了三个不同风格的 Rust GUI 框架:终于总算是勉强能跑起来了。顺便一提,这三个框架都不是稳定版本,功能都不够完善。
唯一值得称道的一点是,我写这篇文章用的工具用的是其中的 Druid 框架写的 Print 编辑器吧。它可以稳定的运行着,虽然功能还不够完善,但是勉强可以用起来。
而且,从输入的效果来看,输入的响应速度还是相当不错的 —— 毕竟在没有各种智能 + 智障提醒的情况下,它不会有多慢。
混合框架 Tauri
为了方便于开发,我开始我假设 Uncode 是运行在浏览器环境的,所以呢,我就找了 Electron 的替代器 Tauri。
Tauri 走的是古老的混合应用框架 Cordova 的思路,通过调用系统默认的 WebView 来作为环境。想想,还是很美好的,所以我尝试了使用 Tauri 运行了第一个 hello, world。然后试着,加了几个功能,也是勉强能接受的,直到我需要一个多窗口的功能,发现没有。
于是,我去 GitHub 上了解了一下情况,看了一眼 Todo:
Frameless Mode (coming soon)
Transparent Mode (coming soon)
Multiwindow Mode (coming soon)
看了一眼时间,没错今年是 2021 了,这些个 Todo 这么多,我还怎么继续啊。
小结,其实呢,如果你用过 Cordova 的话,那你就知道 Cordova 在跨平台上的诸多问题。不过,写写小工具还是相关不错的,hello,world 只需要 600 KB,体积少了 100M 还是很香的。
跨 Web 与原生框架 Iced
接着,我开始寻找了第二个 GUI 框架,我看到了一个更美好的框架 Iced:用 Iced 写的应用,除了可以在桌面上运行,还可以编译为 Web 应用在浏览器上跑。有没有很香??
拿起 Iced 就开发干了:
Flexd 布局 + 1 分,
独立的 Style 编写 + 1 分
……
如下是使用 Iced 编写的 Style,支持一定程度的自定义:
mod style {
...
impl container::StyleSheet for ProjectToolWindow {fn style(&self) -> container::Style {container::Style {backg round: Some(Background::Color([1.0, 1.0, 1.0].into())),text_color: Some(Color::BLACK),..container::Style::default()}}}
}
那,我们来写个编辑器吧。咦,没有多行 text input。我思考了一下一个编辑器的工作量,我决定放弃这个框架。
总结:API 非常友好,至少我是觉得不错滴,但是 widget 不全。
桌面级 Druid
我要醒醒醒醒,原生 GUI 开发和 Web UI 开发不一样,大部分组件库没那么全的。嗯,看来这样一来,我的目标就很清晰了:多窗口 + 多行文本。一波努力之下,我找到了 Druid。然后看了看作者的头像,似乎有点眼熟,点进去一眼,原来就是那个写 Xi Editor 的作者了。
编辑器支持功能 GET。同时还有 xi-win 作为参考版本,widget 里还提供了多行文本的支持,也就是我现在在写本文的这个工具,用的就是多行文本。虽然,后期得自定义,但是至少得是 it works。
内置多语言支持。
官方提供了主题的 Demo。
官方有一个参考应用:字体编辑器。
排版方式上,同样是可以用 Flex,如下:
fn make_ui() -> impl Widget<AppState> {
Flex::column()
.with_child(navigation_bar())
.with_flex_child(center(), 1.0)
.with_child(bottom_tool_window())
.with_child(status_bar())
.background(crate::theme::BACKGROUND_COLOR)
}
比较有意思的是,这个框架内置了大量的 GUI 范式,你得按它的模式来编写。
总结:基本可用的 Rust GUI 库,文档还有待完善。
Rust GUI 编程漫谈:超越 Web 与原生 GUI相关推荐
- python gui编程框架添加工具栏_Python之GUI实现
用到了python的GUI包:wxpython 一. wxPython是Python的GUI图形库.很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为wxWidgets的Pytho ...
- python实现gui编程_怎样用Python3实现GUI编程?
目前来说,大部分用python实现GUI开发,主要是tkinter,wxPython,PyQt这3个包,如果你只是实现一个小型的桌面GUI应用,做个小型系统的话,tkinter和wxPython完全就 ...
- 是否要学点GUI编程
传统GUI编程相对于Web前端编程来说,应该要复杂点.以MVC的要求来看,大多数现有系统代码可能都不达标.但在Web领域,通过框架的约束,是个人都知道要MVC. MVC有Classic MVC和Web ...
- python qt gui快速编程 pdf_翻译:《用python和Qt进行GUI编程》——介绍
介绍: 这本书讲的是如何利用Python和Qt来开发GUI应用程序的.仅仅需要一点点必备的知识:你可以使用一些面相对象的语言来编程,例如C++,C#,java或者python等等.在富文本编辑的那些章 ...
- GUI编程介绍,为什么学GUI编程,监听到底是怎么一回事?
文章目录 1.关于GUI编程 1.1 简介 1.2 GUI 介绍 1.3 GUI 的好处 1.4 GUI 的基本组件内容 2. GUI 的核心 2.1 java.awt.*; 2.2 Swing 3. ...
- Ebiten Go语言GUI编程
Go语言GUI编程包-Ebiten 文章目录 Go语言GUI编程包-Ebiten 1. 前言 2. Ebiten库介绍 3. Ebiten在窗口显示文字 4. Ebiten在窗口显示图片 4.1 直接 ...
- python的gui编程用途_Python19-03_GUI编程----GUI编程的介绍(第一个程序)
GUI编程的介绍(第一个程序) GUI图形用户界面编程 我们前面实现的都是基于控制台程序, 程序和用户交互通过控制台来完成. GUI(Graphics User Interfance)即图形用户界面编 ...
- 2019 年,Rust 与 WebAssembly 将让 Web 开发更美好
作者 | Nick Fitzgerald 译者 | 弯月 责编 | 屠敏 出品 | CSDN(ID:CSDNNews) 将 Rust 编译成 WebAssembly 应该是快速且可靠的 Web 代码的 ...
- 什么是Linux的原生GUI API?
本文翻译自:What is Linux's native GUI API? I hope this doesn't come across as a stupid question but it's ...
最新文章
- springboot 整合retry(重试机制)
- Git 什么时候用什么指令
- iOS之深入解析“锁”的底层原理
- nginx禁止访问目录中可执行文件
- Python | 如何强制除法运算为浮点数? 除数一直舍入为0?
- UI设计灵感|注册登录界面设计灵感
- lr接口压测_LoadRunner+Java接口性能测试
- 十大排序算法——快速排序法【挖坑法、左右指针法、前后指针法和优化方式三路快排】(C语言)
- CF1157D N Problems During K Days(简单构造)
- 分享一个TEXT文档加密/解密编辑器
- python爬虫:获取12306网站火车站对应三字码
- Java培训机构可靠吗?
- vue2 数据回显取消编辑不修改原数据
- 创建相册,批量删除,图片预览,上传图片
- Windows更新错误代码0x8007000e
- 用友U9数据库--用户对应的权限明细查询
- Springboot启动提示:com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILAB
- 初中三年级数学可以用计算机吗,不到3分钟,这份初中数学攻略被家长和学生疯狂转发!太实用了!...
- 2021年全网最细 VirtualBox 虚拟机安装 Ubuntu 20.04.2.0 LTS及Ubuntu的相关配置
- Java后端实习总结--福州之旅