问题

什么语言最适合做 GUI?

回答
选择最适合做 GUI(图形用户界面)的语言是一个复杂的问题,因为它取决于多种因素,包括项目的需求、开发者的经验、目标平台以及对性能、可维护性和生态系统的偏好。没有一种“万能”的语言适合所有 GUI 开发场景。

不过,我们可以从几个维度来分析哪些语言在 GUI 开发中表现出色,并深入探讨其原因。

核心考量因素:

1. 开发效率与易用性: 语言的简洁性、学习曲线、是否有强大的库支持可以快速构建界面。
2. 跨平台能力: 应用程序是否需要在多个操作系统(Windows, macOS, Linux, Web, Mobile)上运行。
3. 性能: 对于需要高度响应和处理大量图形数据的应用,性能至关重要。
4. 生态系统与工具链: 丰富的 UI 组件库、成熟的 IDE、调试器、打包工具等能极大地提升开发体验。
5. 社区支持与资源: 庞大的社区意味着更多的教程、示例代码、解决方案和第三方库。
6. 特定平台优化: 有些语言或框架能更好地利用特定操作系统的原生特性。
7. 部署与分发: 应用程序的打包和分发方式是否便捷。

主流且适合 GUI 开发的语言及其分析:

下面我将详细介绍几种在 GUI 开发领域表现突出的语言和技术栈,并分析它们的优劣势:



1. Python

优势:

极高的开发效率和易用性: Python 语法简洁、易读、易写,学习曲线平缓。这使得开发者可以快速地搭建原型和实现功能。
丰富的 GUI 库选择:
Tkinter: Python 内置的标准 GUI 库,简单易用,无需额外安装。适合小型、简单的桌面应用。
PyQt/PySide: 基于 Qt 框架的 Python 绑定。Qt 是一个非常成熟、功能强大且跨平台的 C++ 框架,PyQt 和 PySide 提供了访问 Qt 所有功能的接口。它们拥有大量的预制 UI 组件,支持复杂的布局、样式 (CSSlike stylesheets)、动画、拖放操作、数据库集成等。这是 Python 中最强大、最常用的 GUI 开发方案。
Kivy: 一个开源的跨平台 Python 框架,用于快速开发应用,其独特之处在于使用自定义的 Kivy Language (KV) 来定义 UI,并支持多点触控和现代化 UI 设计。它不仅可以用于桌面应用,还能轻松打包成 Android 和 iOS 应用,是移动端 GUI 开发的一个有力选项。
wxPython: 另一个成熟的跨平台 GUI 工具包,它使用原生控件,因此应用的外观更接近于操作系统的原生风格。
Dear PyGui: 一个相对较新,但性能非常优秀的 GUI 库。它使用 GPU 加速,适合需要高性能图形渲染的场景,如游戏开发工具、科学可视化等。
庞大的生态系统: Python 拥有海量的第三方库,可以轻松集成数据处理、机器学习、网络通信等功能到 GUI 应用中。
社区活跃: 遇到问题时,很容易找到帮助和解决方案。

劣势:

性能瓶颈: Python 本身是解释型语言,对于 CPU 密集型任务或需要极致响应速度的 GUI,可能会遇到性能瓶颈。尽管可以通过 C 扩展(如使用 NumPy, SciPy 或 Cython)来优化,但这增加了复杂性。
打包与分发: 将 Python GUI 应用打包成可执行文件(如 .exe, .app)有时会比较麻烦,文件体积也可能较大。
原生外观: 一些 Python GUI 库可能无法完全模拟操作系统的原生外观,需要额外配置或使用特定库(如 wxPython)。

适合场景:

快速原型开发
数据可视化工具
科学计算和工程应用
需要集成 AI/ML 功能的桌面应用
对跨平台有需求,且性能要求不是极端的桌面应用
初学者入门 GUI 开发



2. JavaScript (结合 HTML/CSS 和框架)

优势:

Web 是事实上的 GUI 平台: 绝大多数用户都会通过浏览器与界面交互。JavaScript 是 Web 页面的原生脚本语言,可以实现动态、交互式的用户界面。
跨平台性极强: 通过浏览器,JavaScript 可以运行在任何有浏览器的设备上,包括桌面、移动设备、物联网设备等。
强大的前端框架:
React, Vue.js, Angular: 这些现代前端框架提供了组件化开发、声明式 UI、状态管理等能力,极大地提高了构建复杂、可维护的 Web GUI 的效率。
Electron: 使用 Electron,开发者可以使用 HTML, CSS, JavaScript (以及 Node.js) 来构建跨平台的桌面应用程序。Slack, VS Code, Discord 等知名应用都使用 Electron。这使得 Web 开发技能可以直接迁移到桌面 GUI 开发。
Tauri: 另一个使用 Web 技术构建桌面应用的框架,相较于 Electron,Tauri 通常有更小的安装包和更低的内存占用,因为它使用了 Rust 作为后端,并结合 WebView。
庞大的社区和资源: JavaScript 和 Web 技术拥有全球最大的开发者社区,有源源不断的库、工具和教程。
即时更新和部署: 对于 Web 应用,更新和部署非常便捷,用户无需手动安装新版本。

劣势:

性能上限: 尽管现代浏览器和 JavaScript 引擎(如 V8)性能已经非常高,但对于需要极低延迟、大量图形计算或原生性能的应用,依然不如原生开发。
浏览器兼容性: 需要考虑不同浏览器之间的差异。
Electron 应用的资源占用: Electron 应用通常比原生应用消耗更多的内存和 CPU 资源,并且启动速度可能稍慢。
安全性考量: 在 Web 环境中需要特别注意安全问题。

适合场景:

所有 Web 应用的界面开发
需要跨平台部署,特别是对桌面应用有需求,且可以接受使用 Electron 或 Tauri 的场景
需要频繁更新和迭代的应用
需要利用 Web 生态系统中海量 UI 库和工具的应用



3. C (结合 .NET 和 WPF/WinForms/MAUI)

优势:

强大的原生 Windows GUI 开发:
Windows Forms (WinForms): 早期但成熟的 GUI 框架,易于学习和使用,提供了大量的拖放式可视化设计工具。
Windows Presentation Foundation (WPF): 更现代、更强大的框架,支持声明式 UI (XAML), 数据绑定, 样式, 模板, 动画, 矢量图形等,可以创建高度定制化且外观精美的界面。
跨平台能力增强:
.NET MAUI (Multiplatform App UI): 是微软最新的跨平台 UI 框架,允许开发者使用 C 和 XAML 来创建一套代码,运行在 Windows, macOS, Android, iOS 上。它是 Xamarin.Forms 的下一代。
优秀的 IDE 和工具链: Visual Studio 是业界顶级的 IDE 之一,为 C 和 .NET 开发提供了无与伦比的开发、调试和设计体验。
高性能: C 是编译型语言,性能接近于 C/C++,非常适合需要高性能的桌面应用。
丰富的生态系统: .NET 生态系统非常庞大,有大量的库和框架支持各种开发需求。
类型安全: C 是强类型语言,有助于减少运行时错误。

劣势:

学习曲线相对较陡峭: 相比 Python 或 JavaScript,C 的概念和 .NET 生态系统可能需要更多时间学习。
跨平台成熟度: 虽然 MAUI 在努力,但与其他一些成熟的跨平台方案(如 Qt)相比,其生态和社区可能还不够成熟。
部署: .NET 应用的部署相对简单,但用户需要安装 .NET 运行时(除非进行自包含部署)。

适合场景:

Windows 桌面应用程序开发 (首选)
需要高性能和稳定性的企业级桌面应用
需要利用 .NET 生态系统(如 ASP.NET, Entity Framework)的应用程序
希望通过一套代码实现 Windows, macOS, iOS, Android 跨平台开发的场景(使用 .NET MAUI)



4. C++ (结合 Qt, wxWidgets, MFC 等)

优势:

极致的性能和底层控制: C++ 是为系统编程和高性能应用设计的,可以实现最快的执行速度和最精细的资源控制。
成熟且强大的跨平台 GUI 框架:
Qt: 最流行、功能最全面的跨平台 C++ GUI 框架之一。它提供了一套完整的工具和库,用于创建美观、高性能、跨平台的桌面和移动应用。Qt 的优点在于其成熟度、丰富的功能集(从 UI 到网络、数据库、多媒体等)和优秀的设计。
wxWidgets: 另一个优秀的跨平台 C++ GUI 工具包,它尝试使用目标操作系统的原生控件,从而使应用程序具有更自然的本地外观。
MFC (Microsoft Foundation Classes): 微软推出的用于 Windows 平台开发的框架,虽然相对老旧,但在许多遗留系统和需要深度集成 Windows API 的场景下仍然有其价值。
原生性能和最小的资源占用: 使用 C++ 开发的 GUI 应用通常性能最高,资源占用最少,启动速度最快。
硬件交互和嵌入式系统: 在需要直接访问硬件、驱动程序或开发嵌入式系统 GUI 时,C++ 是不二之选。

劣势:

极高的开发难度和开发效率低: C++ 语言本身复杂,手动内存管理、指针等概念增加了出错的可能性,开发周期长,开发效率相对较低。
学习曲线最陡峭: 是所有语言中学习难度最大的。
编译和部署的复杂性: 编译过程可能耗时,跨平台编译也需要专门的配置。
内存安全问题: 手动内存管理容易导致内存泄漏、野指针等问题,需要开发者具备扎实的 C++ 功底。

适合场景:

对性能有极致要求,且需要精确控制内存和资源的应用程序(如高性能游戏引擎的编辑器、CAD 软件、3D 建模工具)。
需要跨平台,且追求最佳性能和原生体验的桌面应用。
嵌入式系统 GUI 开发。
开发底层 GUI 库或框架本身。
需要与 C/C++ 代码库深度集成的应用。



5. Java (结合 Swing, JavaFX)

优势:

一次编写,到处运行 (Write Once, Run Anywhere): Java 的虚拟机 (JVM) 使得 Java 应用可以在任何支持 JVM 的平台上运行,实现了良好的跨平台性。
成熟的 GUI 库:
Swing: 较早的 Java GUI 工具包,提供了丰富的组件,外观可以自定义。
JavaFX: 现代化的 Java GUI 平台,支持声明式 UI (FXML), CSS 样式, 动画, 多媒体等,可以创建更现代、更具吸引力的界面。
强大的生态系统和社区: Java 拥有庞大且成熟的生态系统,有大量的库和工具支持。
相对较高的性能: 尽管是解释执行,但 JVM 的 JIT (JustInTime) 编译技术可以实现接近原生代码的性能。
内存管理: 自动垃圾回收机制简化了内存管理。

劣势:

外观的原生性: Swing 和 JavaFX 的组件可能不如原生控件那样与操作系统完美融合,虽然 JavaFX 通过 CSS 提供了很大的自定义空间。
启动速度和内存占用: JVM 的启动需要一定时间和资源,应用可能比原生应用启动慢,内存占用也可能更高。
打包与分发: 将 Java 应用打包成独立的可执行文件有时会遇到一些挑战。
移动端开发: 虽然可以使用 Android SDK 直接开发 Android 应用,但用于构建跨平台 GUI 的框架(如 AndroidFX)相对不如 Kotlin 或 React Native 成熟。

适合场景:

跨平台企业级桌面应用。
需要利用现有 Java 生态系统的项目。
对图形效果和现代化 UI 有一定要求(使用 JavaFX)。
已经有 Java 开发团队的项目。



6. Swift / ObjectiveC (macOS/iOS)

优势:

Apple 生态系统的首选: Swift 是 Apple 官方推荐的用于开发 macOS, iOS, watchOS, tvOS 应用的现代语言。ObjectiveC 则是其前身,仍然在许多遗留项目中使用。
最佳的原生体验: 使用 Swift/ObjectiveC 结合 Cocoa/Cocoa Touch 框架(如 UIKit, AppKit, SwiftUI)可以实现与 Apple 平台最紧密的集成和最优的原生用户体验。
高性能: Swift 经过优化,性能非常高,接近 C++。
现代语言特性: Swift 提供了许多现代化的语言特性,如类型安全、可选类型、协议导向编程,使得开发更安全、更高效。
SwiftUI: Apple 推出的声明式 UI 框架,可以轻松实现跨 Apple 平台(macOS, iOS, watchOS, tvOS)的 UI 构建,开发效率极高。

劣势:

平台局限性: 主要针对 Apple 生态系统,在 Windows, Linux, Android 等平台上的原生支持非常有限(尽管有一些第三方框架在尝试,如 uno platform)。
学习曲线: Swift 的学习曲线相对平缓,但要精通 Apple 的框架仍然需要时间。

适合场景:

所有针对 macOS 和 iOS 的应用程序开发。
需要与 Apple 生态系统深度集成的应用。



7. Kotlin (结合 Android SDK, Compose, KMM)

优势:

Android 开发的首选: Kotlin 是 Google 官方推荐的 Android 开发语言,取代了 Java。它更简洁、更安全,并且与 Java 完全互通。
Jetpack Compose: Kotlin 的声明式 UI 工具包,用于构建原生 Android 应用。它与 SwiftUI 和 React 的理念相似,开发效率高,可以创建美观的 UI。
跨平台潜力:
Kotlin Multiplatform Mobile (KMM): 允许开发者共享 Kotlin 代码(包括 UI 逻辑、业务逻辑等)到 iOS 和 Android 平台,大幅提高跨平台开发效率。虽然 UI 本身可能仍需要针对不同平台使用原生工具,但核心逻辑的复用是巨大的优势。
Compose Multiplatform: JetBrains 推出的项目,允许使用 Jetpack Compose 构建桌面(JVM)、Web(JS)以及原生移动应用。这是一个非常有前途的跨平台 UI 解决方案。
安全性与简洁性: Kotlin 在语言层面提供了许多安全特性(如空安全),并具有简洁优雅的语法。

劣势:

Compose Multiplatform 的成熟度: 尽管发展迅速,但相比一些老牌跨平台框架,其生态和社区还在不断壮大。
平台限制(KMM UI): KMM 主要用于共享业务逻辑,UI 部分通常还是需要针对原生平台使用不同技术栈。

适合场景:

原生 Android 应用开发。
希望构建跨平台移动应用(Android 和 iOS),并希望共享核心逻辑的开发者。
对使用声明式 UI 框架构建 Android 应用感兴趣的开发者。
探索使用 Jetpack Compose 构建多平台应用的开发者。



8. Dart (结合 Flutter)

优势:

跨平台 UI 框架: Flutter 是 Google 开发的 UI 工具包,使用 Dart 语言,一套代码可以编译成原生 ARM 代码,运行在 Android, iOS, Web, Windows, macOS, Linux 等多个平台上。
美观且高性能的 UI: Flutter 绘制自己的 UI 组件,不依赖原生控件,因此可以实现高度定制化和一致性的跨平台 UI,性能也非常出色,接近原生。
快速开发: Flutter 的热重载 (Hot Reload) 功能允许开发者在几秒钟内看到代码更改的效果,极大地提高了开发效率。
渐进式采用: 可以将 Flutter 集成到现有的原生应用中。
增长迅速的社区: Flutter 和 Dart 的社区增长非常迅速。

劣势:

新的生态系统: 相比一些老牌技术,Flutter 的生态系统仍在建设中,一些特定功能的库可能不如原生或成熟的 Web 技术丰富。
语言学习: Dart 语言相对容易学习,但对于没有接触过声明式 UI 或响应式编程的开发者来说,需要适应。
应用体积: Flutter 应用的初始安装包通常比原生应用略大。

适合场景:

需要一套代码构建高质量、美观的移动应用(Android & iOS)的场景。
希望将同一套 UI 代码应用到桌面和 Web 平台的场景。
对快速开发迭代有较高要求的项目。



如何选择?

1. 目标平台是第一考量:
只针对 Web: JavaScript (React, Vue, Angular) 是唯一选择。
只针对 macOS/iOS: Swift/ObjectiveC (SwiftUI, UIKit, AppKit) 是最佳选择。
只针对 Windows: C (.NET WPF, WinForms) 是非常好的选择。
跨平台(移动为主): Flutter (Dart), React Native (JavaScript), Xamarin/.NET MAUI (C), Kivy (Python) 都是不错的选择。Flutter 和 React Native 通常是更流行的选择。
跨平台(桌面为主): Qt (C++), Electron/Tauri (JavaScript), .NET MAUI (C), Flutter (Dart), JavaFX (Java) 都可以考虑。
跨平台(全平台,含移动、桌面、Web): Flutter 是一个强大的统一方案。

2. 团队技能和经验:
如果团队擅长 Python,那么 PyQt/PySide 或 Kivy 是自然的选择。
如果团队熟悉 Web 开发,那么 Electron, Tauri, React Native, Flutter (Dart) 都是可行的。
如果团队有 .NET 背景,那么 C 配合 WPF 或 MAUI 会更顺畅。

3. 性能需求:
极致性能: C++ (Qt, wxWidgets) 是首选。
高性能: C (.NET), Java, Swift, Dart (Flutter) 表现优秀。
一般性能: Python (Tkinter, PyQt) 在大多数非密集型任务中也足够。

4. 开发速度和易用性:
最快开发: Python, JavaScript (配合成熟框架), Dart (Flutter) 通常开发效率最高。
学习曲线最平缓: Python, JavaScript, Dart。
学习曲线最陡峭: C++, C。

5. 生态系统和库支持:
最庞大和成熟: JavaScript, Java, Python, C。
快速增长: Flutter (Dart), Swift/Kotlin。

总结来说:

对于初学者或者需要快速开发的简单桌面应用: Python (Tkinter, PyQt) 是一个不错的起点。
对于需要构建现代、高性能、跨平台(移动和桌面)应用,且重视开发效率的: Flutter (Dart) 和 React Native (JavaScript) 是非常强有力的竞争者。
对于需要极致性能和底层控制的桌面或系统级应用: C++ (Qt) 是最佳选择。
对于 Windows 桌面应用,特别是企业级应用: C (.NET WPF) 是非常成熟和强大的方案。
对于 Apple 生态系统内的开发: Swift (SwiftUI) 是不二之选。
对于 Web 应用: JavaScript (配合 React, Vue, Angular) 是唯一的选择。

最终的选择需要权衡以上所有因素,并根据具体项目需求做出决定。有时候,采用混合技术栈(例如,用 Python 编写后端服务,用 JavaScript 构建前端 Web UI,或者用 C++ 编写性能关键的库并被 Python 调用)也是一种常见的策略。

网友意见

user avatar

很多年以前,我是推荐过 Electron 的,但现在似乎有点过热了,所有桌面开发话题下都会看到 Electron 来凑热闹,你在一边安静的对比着 MFC 和 Qt 的优劣,或者你在讨论 c# 的 WinUI / maui 的话题,没有涉及到任何 Web 技术,也会有一堆 Electron Boy 们来话题下面找存在,跟你说你们说的都是垃圾,不如用 Electron,这就有点烦人了。

凡事过犹不及,你用 Electron 解决一类需求很爽没问题,但是一厢情愿的希望希望用它解决任何问题是不可能的,技术选型得清楚各项技术的边界在哪里,所以咱们分析下 Electron 有哪些问题。

很多人搞混淆了 “内容消费”和 “内容创作”了,现在电子设备分工越来越明确,随着移动应用的兴起,内容消费的功能都在往移动设备上迁移。PC 已经是越来越存粹的效率工具了。两个有本质的区别:移动界面是消费级应用,界面要好看,要容易操作,比如方便触屏的大按钮;而桌面软件会越来越朝向生产力方向发展,强调的是专业和效率。

你要做娱乐或者社交,这类轻交互的内容消费类应用,那么用 Electron 没问题,但如果要开发生产力工具,请使用 Native 技术,继续用 Electron 这种消费领域的技术来开发生产力工具,是不行的。

说到这里,很多 js boy 们又要把 vscode 抬出来说了:“你看 vscode 也是创作工具,做的多成功”,vscode 成功不代表它不卡,不代表它臃肿,这还是微软百人团队优化了 5 年以后的效果,你个普通公司,普通团队,靠 Electron 做出来的编辑器,上限也就是 github 的 atom 编辑器了,github 的开发能力做出来一团翔的编辑器,你在的公司技术能力比 github 如何呢?

微软百人团队大量性能相关模块改用 C++ 重写,搞了这么多年,最后性能还不如一个个人开发者用 C++ 开发出来的 Notepad++ 那么快,普通团队何德何能玩得转呢?

不要以为 wasm 是你的救命稻草,wasm 的性能只有 native 的一半:

这就是为啥 vscode 的语法高亮/正则表达式用 wasm 编译以后还是慢的原因。

如果用到 SIMD 指令集的项目,用 wasm 编译出来性能还会比 native 慢个四五倍,比如 ffmpeg 这类项目,在 wasm 上跑起来,实测就是四倍的性能差距,还特别占内存。

随着今后 PC 越来越往生产力工具上靠拢,你要开发成熟的内容生成型的应用,请选择 native 语言。

而娱乐社交类复杂了以后,Electron 也不行了,甭跟我说什么 slack,钉钉,他们做的并不好,要学的话学点好的,IM 领域技术做的最好的,telegram,人家是 Qt 开发的。

即便是简单的应用 Web 技术开发出来的东西,用起来总有种软绵绵的感觉,没有 native 语言做出来的那种专业和硬朗的体验。

最后补张图:


Electron 能覆盖桌面开发的一个角落,但是远远不是桌面开发的全貌,它和 Native 的区别,就像网页游戏和端游一样,有本质区别。

--

你在 2022 年新配一台电脑,CPU 不快也不慢,内存不多也不少,开个 JetBrain 内存少 4G,开个 Chrome 内存又少 4G,再开个 vscode 内存少 2G,然后钉钉,飞书,微信,网易云音乐,每个占 2G,什么事情都没干呢,18GB 内存就没了。

真是一个赛着一个臃肿,是要梦回唐朝以胖为美吗?

最后再配一张图:

不过瘾,再来一张:


哈哈,每次看这张图都笑死我了。

当年页游火的时候,不少公司都开新项目蹭过热度,页游开发者们成天秒天秒地秒空气,而今何在呢?所以说,历史总是在螺旋上升的。


--

user avatar

很少有人不基于框架直接写GUI界面啦,我这个回答就从GUI框架反过来推什么语言做GUI合适。(只聊桌面端GUI编程框架)

Qt

几乎是C++领域最流行的跨平台桌面端软件开发框架了,这个框架是两个挪威人在1995年创建的,发展至今可以说历史相当悠久,稳定性也很有保障。很多大公司都在用它做界面比如金山的WPS。

它内置了自绘引擎,也就是说界面上的一个按钮,一个文本框,都是Qt的引擎自己画的,这保证了基于Qt开发的软件界面在不同操作系统上看起来是一模一样的。

它提供了大量的与界面无关但与软件开发息息相关的API,比如、网络、文件系统、剪切板等,而且让这些API在不同的操作系统下都有效,这极大的节省了开发人员的时间。

但它也有一些缺点,比如在处理一些特殊需求上很不方便,比如:目前Qt有没有比较好解决高分屏下缩放显示的方案?Qt没有真正完美的无边框解决方案吗?等,在一些组件的渲染上也会出一些隐藏的较深的问题(QListItem),一旦遇到,就很难解决。

Qt近年来不太专一,qml,qtquick等,搞了很多,而且这些新玩意儿一直不温不火,有些模块做了又废弃了,比如:qt script,搞来搞去,搞的模块繁多且复杂,用起来不是很舒服。

Qt有界面描述语言(XML描述界面),可以通过设计器拖拽空间设计界面,编译期界面描述语言被转义成C++代码,性能上没啥损失。

Qt商业授权不太友好,开发商业应用一定要谨慎,之前听说有公司为此付出了高额的版权费。个人开发者可以免费使用。Qt的免费版本不允许静态链接,会有版权上的限制,但开发者还是可以通过一些特殊的编译方法静态连接Qt的库的。

除了使用C++开发Qt应用外,开发者还可以使用其他语言开发Qt应用,最流行的就是使用Python基于PyQt做Qt应用了,其他语言的绑定不是很成熟,但PyQt仍然有版权的问题。

GTK

GTK是1997年创建的,也非常成熟稳定,是C语言开发的,但有很多语言的绑定,比如官方支持的JavaScript、Rust等,当然用C++语言操作GTK也很方便,它也有自绘引擎(Cairo),也提供了大量系统相关的API,商业授权也非常友好,基于GTK开发商业软件不用担心收到律师函的问题,虽然它是一个跨平台桌面软件,但它似乎只在Linux操作系统领域流行,有非常多的Linux桌面软件都是基于GTK开发的。

这也直接导致GTK的维护者很重视Linux领域的发展,而忽视Windows和Mac领域。这个框架提供的很多API,只在Linux下有,Windows和Mac下没有。这样的API数量众多。甚至在Windows下编译一下GTK的源码都要比Linux下难很多。而且GTK的渲染引擎在Windows下性能表现也不如在Linux下好。

GTK在Windows上也没办法静态连接,它到不是因为版权的问题,而是它依赖MSYS2的一些库,这个库用于在Windows上模拟Linux环境,这也是为什么GTK在Windows上表现不佳的原因之一。

另外,由于GTK是C语言开发的,所以开发风格也很C语言化,这对于部分开发者来说可能觉得繁琐。

wxWidgets

wxWidgets是1992年英国的一个大学教授开创的跨平台GUI软件,也非常成熟稳定,商业授权非常友好。它没有自绘引擎,而是对不同平台下的界面API做了整合和封装,这样开发者在Windows下开发的软件看起来就是Windows窗口风格、Linux开发的软件看起来就是Linux窗口风格,这对于某些软件来说,正是他们想要的,但要想搞一些花哨的特效就没那么容易了。它同样也提供了大量的系统相关的API供开发者使用。

它是C++开发的,所以对C++开发者非常友好,除此之外它还支持静态连接,也就是说开发个应用不用分发给用户一大堆dll,当然Qt也支持静态连接,但是你得自己编译Qt的源码(不是很方便),而且Qt的授权规则也不允许普通开发者这么做。

它会有些小问题,比如我之前提的:wxEVT_NOTIFICATION_MESSAGE_DISMISSED event emit twice,但总体来说还是非常稳的。除了开发的界面比较死板外,没啥大的问题。目前使用这个框架开发软件的人越来越少了。

FLTK

fltk是1998年创建的跨平台开源GUI框架,历史悠久,商业授权友好,而且C++之父也用它,它非常轻量级,支持静态连接,一个简单的应用编译后只有500K左右,非常赞,

它有自己的自绘引擎,没记错的话用的是OpenGL,但它的重绘机制是按区域重绘的,如果组件A所在的区域上存在组件B,那么A组件重绘时,会把B组件的给重回掉,开发者必须自己写代码处理这种情况。想象一下,如果你想实现一个A组件fade out的同时B组件fade in的效果,就会非常麻烦。

FLTK提供的一些组件样式都比较刻板,绘图API也比较少,你想实现一个漂亮一点的圆角按钮(它内置圆角按钮的圆角大小是不能改的),必须自己画,而且还得借助一些非常奇葩的手段才行(如果你想知道,可以联系我)

它是C++开发的,但API不够现代,用起来总体还算舒服的,它有Rust绑定:fltk-rs。它的用户比前面三个都少。它提供了一些与界面无关的操作系统API,但非常少,几乎可以忽略。

Duilib

是2010年国内一个开发者开发的GUI开发框架,因为底层基于DirectUI开发,所以只支持Windows平台,不支持跨平台,开源协议友好,商用没有任何问题(需要附加Lincence文件),国内有很多大厂基于这个技术做桌面端应用,比如网易、腾讯、百度,这个框架是基于C++开发的,对C++开发者友好。但框架本身还有一些问题,比如对高分屏支持不佳、特殊控件绘制上也有一些小问题,除了界面相关的API外,几乎没有提供系统级的API,作者纯粹是用爱发电来开发这个框架,所以更新不是很及时。

相对来说网易基于Duilib开发的分支更完善一些:NIM_Duilib_Framework,添加了高分屏支持、多国语言、整合了多线程处理的支持,但环境搭建相对比较麻烦。如果开发者要用这个框架,一定要用develop分支下的代码,master分支下的代码问题很多,这个框架看上去也是作者一个人努力的成果。

Sciter

Sciter是2006年创建的跨平台闭源GUI框架,足够稳定,商业授权不友好,但个人开发者可以随便用(只能用动态链接库),一旦公司规模超过3人,就得买版权了(有权静态连接)。

它内部封了一个浏览器核心,让开发者使用HTML,CSS,JS来创建界面,但对这个浏览器核心做了大量的精简,不像Electron和NW.js动辄上百兆的体积,它只要6M就够了。当然这也意味着有些浏览器特性它是不支持的,比如CSS3的flex布局,它就不支持(但它提供了自己的flex布局实现方式)。以前它使用自研的一个脚本语言(和JavaScript很像),自从集成了Fabrice Bellard大神的QuickJs之后,就全面支持JavaScript了。它还对一些特殊的场景做了内置的支持,比如渲染大列表。

它使用C++开发,对C++开发者很友好,有Rust、go、Python等语言的绑定,但都是社区提供的,质量堪忧。有很多知名厂商都用这个库做界面,比如360、teamviewer、赛门铁克等。

RmlUi和Sciter很像,可以看成Sciter的替代框架,但RmlUi这个项目有三界作者,一个一个的弃坑不知道新任作者会不会弃坑,目前还不是很成熟,比如我正在尝试帮作者解决的CJK输入法的问题,目前还不推荐大家使用这个框架。

CEF

CEF是2008年创立的,基于Chromium的跨平台GUI框架,稳定且商业授权友好,国内很多大厂都用的CEF:比如微信桌面端、网易云音乐桌面端、QQ桌面端、微信桌面端、MATLAB、FoxMail、OBS Studio,装机量破亿。

由于它几乎封了一个完整的Chromium,所以体积非常大,但支持所有的HTMLCSSJS特性,它几乎不提供任何与操作系统相关的API,创建个托盘图标、读写个文件啥的,都要开发者自己完成,它是C/C++开发完成的,对C++用户非常友好,它有gopythonjava等语言的绑定,但都是社区提供的,质量值得担忧。

它对Chromium封装的很好,避免了开发者直接与Blink、V8、Chromium等复杂的代码打交道,很多功能都有默认实现方式,遵从约定由于配置原则,有经验的C++开发者可以很轻松的驾驭CEF框架。

由于Chromium是版本弟,所以CEF版本发布也非常频繁,很多被标记为稳定的版本,还是会出一些莫名其妙的问题,选一个好的版本非常重要。

与Electron一样,它也是分主进程和渲染进程的,所以开发者要非常娴熟的运用跨进程通信的技术,虽然CEF提供了跨进程相关的API,但复杂度还是有点高的,使用的时候要认真细心。

MAUI

这是微软的跨平台GUI框架,不仅仅支持桌面端,还支持移动端,但官方并不支持Linux的桌面端(黑人问号,感觉与微软近些年向开放、开源的大方针相悖),这个框架新的狠,至今还没发布稳定版。目前还没什么人用。而且不知道将来会不会被微软放弃。

它是.NET平台下的GUI框架,有自绘引擎,对C#开发者很友好,界面依然是用XAML描述的,可能很多人一听到XAML就直接弃坑了。XAML表现力确实弱一些,我觉得WPF没火起来跟XAML有直接关系。

使用这个框架开发桌面应用得封一个.NET框架给用户,当然有了.NET框架应用程序访问一般的系统级API也就不成问题了。

Compose Multiplatform

这是JetBrains搞的跨平台GUI框架,也非常新,前段时间刚刚推出1.0.0版本,但这个版本还不是很稳,至少比Flutter Desktop的第一个稳定版要差很多。同样也几乎没什么人用。

它的自绘引擎用的是Google的skia,这个自绘引擎稳的很,Chrome和Flutter都是用的它,所以排版、绘制、渲染之类的工作不太会出问题。比Java生态圈里的Swing和JavaFx要好很多。

JetBrains的东西当然对Kotlin开发者友好啦,Java生态下的很多东西你都能用,访问系统级API也没啥大问题,同样也得考虑封一个JRE给用户。

flutter-desktop

这是谷歌的跨平台开发框架,开源、免费、文档齐全、投入力度大且持久,同样也新的很,Windows版本刚刚发稳定版,Mac版本还没稳定。

如果你完全没搞过移动端的flutter,想用这个框架开发桌面应用,那么意味着你要学的东西还挺多的。好在dart和flutter入门都不是很难,学习曲线比较平缓。

由于flutter在移动端积累了很多年,所以界面上的一些东西在desktop端都比较稳(skia自绘引擎),与操作系统相关的东西还不成熟,生态也不太好,比如你想订制一下窗口的标题栏,想访问一下注册表这类工作可能得自己想办法。不过它有类似FFI的支持,跟C/C++语言打交道很方便。

开发者直接使用Dart语言描述界面,这会导致众多大括号嵌套在一起的问题,可能很多开发者不习惯。

webview2

这是微软Edge浏览器团队推出的跨平台GUI引擎,是闭源的,目前只支持Windows,对C#和C++开发者友好,如果使用C#开发,就得考虑把.NET运行时分发给用户,如果使用C++开发,就得自己处理系统级API的操作,webview2本身是不对系统级API做封装的。

这个框架推出也没多久,很多API也还不稳定,更值得担忧的是这个团队,他们前不久刚刚放弃了自己的浏览器核心转而使用Chromium浏览器核心,不知道他们会不会放弃webview2这个框架。

它的优势是可以复用系统当中已存在的webview2二进制资源,也就是说它虽然封了一个Chromium浏览器核心,但如果你可以确定客户电脑已经存在了基于webview2开发的应用,你的安装包体积可以足够小。

它也是多进程架构,甚至比Electron还要多一个进程(为了复用二进制资源),资源占用比较多。

webview

这个库使用操作系统的浏览器引擎来达到减小安装包体积的问题,Mac上使用Cocoa/WebKit,Linux上使用gtk-webkit2,Windows 10上使用Edge(也就是上一个小节里提到的webview2),它应该是不支持Win7的。开发者要考虑前端代码浏览器兼容的问题。

开源且免费(MIT)有go、Rust、Python等语言的绑定,不过官方支持的是go语言,C和C++,操作浏览器的API非常少,不支持自定义scheme,更别提系统级API了。

TAURI

采用的技术方案与webview类似,所以安装包也足够小,非常新,还没发布稳定版,开源免费。webview框架碰到的问题TAURI都有,

使用Rust开发,将来会支持Deno,作者说将来会直接使用webview的技术来支持多平台,

NW.js

NW.js最早把Chromium和Node绑定到一起,用前端知识做界面,用Node技术访问操作系统,最早叫node-webkit,在2012年创建。NW.js基于MIT开源,可以无忧使用。没记错的话,微信小程序开发工具是用NW.js开发的。作者是英特尔的员工,英特尔的一些工具也是用NW.js开发的。

除了Chromium和Node的能力外,NW.js自己也封装了一些系统级API,类似托盘图标、剪切板、系统菜单这种,但数量明显比Electron要少。

NW.js可以在多个窗口间共享同一个Node.js上下文,而且还可以通过配置让Node的上下文和Dom上下文混合,这给开发者带来了很多便利。心智负担减少很多。不像Electron要时刻想着进程间通信,哪些模块当前进程不能用这类问题。

NW.js虽然起步早,但奈何没有杀手级应用,周边的生态和工具链没发展起来。用的人越来越少,维护的投入也不如Electron大,再加上Chromium更新非常频繁,导致NW.js的有些API也不是很稳,恶性循环加剧。

Electron

Electron的作者曾经在NW.js团队工作过(NW.js项目贡献第二多的人就是Electron的作者),后来辗转到了github公司,于2013年在创建了Electron,也是个开源免费的产品。由于VSCode、slak等国际型产品都选择了Electron,所以从者甚众,生态和周边工具链也完善的多。虽然开发方式上有点蹩脚的地方(多进程架构及模块归属进程),但瑕不掩瑜。

Electron每创建一个窗口都会多一个进程,这使Electron创建窗口的效率不高(秒级),NW.js有复用进程的机制,即使新窗口加载完全不同域的页面也不会创建新的进程(毫秒级)。这也是为什么很多基于Electron开发的应用都使用Dom模拟弹窗的原因。

无论是浏览器相关的API,还是系统级API,Electron提供的都比NW.js多。

--------2022-02-25更新--------

这些框架除了对开发者使用的编程语言有要求外,还有一个重要的差异就是有没有独立的界面描述语言(也就是UI DSL),这非常重要,涉及到一个框架表达业务的重要能力。

类似XAML、qt的ui文件、HTML+CSS都是界面描述语言,下面这种也可以算界面描述语言,但我感觉它不够纯粹(flutter、qml和Compose Multiplatform都是类似这样的):

       panel {   row {     checkBox(...)     row {       textField(...) // indented relatively to the checkbox above     }   } }     

但无论如何,显而易见的是,没有任何一个界面描述语言能比的上HTML+CSS组合。想想看:HTML里各种花里胡哨的语义化标签和Dom操作技巧,CSS里的布局方式、伪元素、动画描述...,对比之下你就会觉得XAML、qml直流都是弟弟。

除此之外,一个优秀的GUI框架还有两个重要的需求,这里我简单聊聊:

强大的事件处理机制必不可少。

想想这些:鼠标事件、键盘事件、触屏事件...界面加载完成、媒体播放结束、元素大小改变...网络状态变更、数据段传输完成...另外,还得处理事件冒泡、事件捕获、事件分发吧...

qt的开发者曾经说过qt的SIGNAL和SLOT机制是有性能问题的(但影响很小)

强大的异步处理机制必不可少

你不能在用户处理业务逻辑的时候,让界面渲染工作阻塞,这就需要一个强大的异步处理机制,让开发者自己去开线程去完成业务处理,无疑是又麻烦又会增加开发者的心智负担。

我记得很早之前在C# WinForm应用中,点击一个按钮,如果不用Invoke执行逻辑处理的话,界面就会卡死。

这么看来,在你的GUI应用里包一个浏览器核心还是挺有必要的,这样你就可以用HTML+CSS强大的能力来描述你的界面,用JavaScript强大的事件处理机制和异步处理机制来完成用户交互。

可能有人会想,这会带来很多问题呀,比如应用体积会增大的100M以上、会占用更多的CPU和内存资源,还会更耗电等等。

确实,目前来看这些都是问题,但仔细想想,这些问题应该不会持续太久,网络会变的更快,用户的磁盘和内存会变得更大,CPU处理能力也会更好,耗电的问题当然会持续存在,甚至会愈发耗电,但电的供应会持续增长呀。

web相关的技术之所以胜出,并不是这些技术的设计者有多厉害,而是这20多年间,有大量的人涌入了这个领域,前赴后继的推动着它前进。其他任何一个领域都没有这么热火朝天的景象。推荐大家看看我的另一个回答:

------------2022-02-27更新----------

用Web相关的技术做GUI应用的优势是,让开发者可以把大部分精力投注在业务本身上,而不是处理与GUI相关的技术细节。

实际上所有的框架,都应该是这个目的,比如ORM框架,目的应该是让开发者把大部分精力投注在业务与数据之间的关系上,而不是管理关系型数据的技术细节。

当然这肯定是有损耗的,在性能、稳定性、资源消耗上,都会有所削减。而且,因为有框架的存在,开发者很难深入到框架内部做一些特殊的事情。比如,我们该如何修改HTML的排版渲染机制呢?

所以,有些框架注重性能,有些框架注重开发效率,开发者做选择题的时候也应该衡量这两个问题,你的应用对哪些方面要求多一些呢?

你如果要开发一个视频监控系统,没多少业务功能,但要24小时不间断的记录视频数据,随时调取某一段时间的视频数据,这种应用可能Qt是最好的选择。

你如果要开发一个类似飞书的团队协作应用,业务逻辑复杂的一塌糊涂,而且要在短时间内满足更多用户的需求,占领更多的市场,那么Electron可能是更好的选择(目前飞书已经不再用Electron了,他们自己编译了Chromium核心,自己封了一个类似CEF的框架)

目前微软、谷歌、JetBrains等公司都非常重视桌面端开发框架,也在推各自的框架产品,说明桌面应用领域并没有没落,反而应该更加受到重视。

虽然移动端应用大行其道,但我认为,只有生活、社交、轻娱乐等方向上的应用在移动端有较好的发展。文档协作、大型游戏、开发工具、专业管控软件等应用还是在PC端发展的更好一些,毕竟PC端有更多样的输入输出设备、更广阔的显示和交互的空间,更强的存储和计算能力。

希望桌面软件开发领域的从业者都能获得幸福。

满屏荒唐言,一把辛酸泪,一把辛酸泪,一把辛酸泪...


类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有