困扰已久,专业程序员到底怎么写 GUI 程序?

2022-11-15 19:14:57 +08:00
 faketemp

这个问题好奇和困扰已久,实在忍不住我要问出来——如果开发一个 GUI 程序,专业的程序员到底是如何开发和维护 GUI 界面呢?

对我这种"三脚猫"要写工具类软件,多会选用 C#/Delphi/VB/aardio 甚至易语言,总之必须要有一个 IDE 来拖放控件画出界面,也方便修改控件布局 /属性等等,然后集中精力来写(抄改)核心功能代码,事半功倍

但在学习 Golang/python/C/C++等发现几乎没有什么现存的成熟的很方便的 IDE 来组织界面

拿 Golang 来说,尝试去 B/Y 站搜一圈都是类似"fyne/walk/gio/govcl"等,打开库官网查看文档,全部都是只给一段示例代码告诉你这样运行就出现一个自绘的"Hello world"窗口?但对于如何快速地画出想要的界面、布局等等只字不提

搜索视频教程吧,看了十几集无非就是直接拿几百行代码告诉你这几行是画个 600x800 的窗口、那几行是在哪个坐标绘制一个 listview 控件、那几行是添加 Edit 和 Button 、这几行是添加控件响应事件?????

——看的一脸懵逼甚至有些牙疼,你到底是如何画出这个界面的?

都 21 世纪了真的有人写 GUI 程序是要靠脑海中想象出来一张界面草图,然后在记事本 /IDE 中用代码一行行把界面"绘制"出来的吗????

说明:
我知道 govcl 可以自己套用 Lazarus 绘制界面,也知道 python 也有什么 pyqt/Tkinter 等,但集成度低感觉都不直观不方便,并且由于都是非官方维护,大多文档不全资料不足并随时弃坑
最关键的是 感觉也太不优雅了

现在很多都用 Electron ,这个怎么说呢,编个计算器都几十兆我实在难以接受...

10255 次点击
所在节点    问与答
93 条回复
JustSong
2022-11-16 08:05:31 +08:00
PyQt 还可以啊,用的 UI 绘制工具就是官方维护的啊
charlie21
2022-11-16 08:16:46 +08:00
GUI 开发的历史告诉我们这是一个(刻意被抽象出来的)套路很多的领域。web app 开发所用的基于组件的架构 component based architecture 仅仅是其中一个套路。具体可以参考
https://www.freecodecamp.org/news/is-mvc-dead-for-the-frontend-35b4d1fe39ec/

https://web.archive.org/web/20220224051139/https://www.jdon.com/48451
https://www.freecodecamp.org/news/is-mvc-dead-for-the-frontend-35b4d1fe39ec
https://www.jianshu.com/p/dd61bff449a8
https://www.jianshu.com/p/293f74ca1f71

最后两篇文章是用 MVC 去理解 web app GUI (react.js) 开发,可见:MVC 作为一个设计模式的时候是一个 GUI 设计模式 / 软件工程工具; MVC 作为一个 “理解思路” 的时候是一个理解思路 / 思维工具,可以理解各种 GUI 设计模式。这样的思维工具是极为值钱却被低估的(尤其是相比 “编程语言就是工具、开发框架就是工具” 这些廉价工具而言,它是一个贵重工具),会使用这样的贵重工具是一个 experienced GUI 开发人员的要价筹码。

-
shinsekai
2022-11-16 08:17:08 +08:00
为啥工具类软件非要 GUI 呢,命令行选项+回车不行吗
makelove
2022-11-16 08:34:53 +08:00
现在桌面 UI 是 html 的时代,不喜欢 electron 的安装包大可以用 tauri

至于你说的 delphi 这种拖放式画界面早淘汰了多少年了,非纯文本、操作效率低、不容易版本化 /diff...
jink2018us
2022-11-16 08:38:36 +08:00
GUI 这种没有技术含量的东西发展了几十年居然还没搞出个所想即所得,op 这个专业的程序员按耐不住了
charlie21
2022-11-16 08:48:06 +08:00
https://github.com/iced-rs/iced#overview [1]
这是 rust 的一个 GUI 框架: iced

Overview
Inspired by The Elm Architecture, Iced expects you to split user interfaces into four different concepts:

State — the state of your application
Messages — user interactions or meaningful events that you care about
View logic — a way to display your state as widgets that may produce messages on user interaction
Update logic — a way to react to messages and update your state

在研究 GUI 开发理念的时候,关注这样的框架是我认为正确的研究方法。
因为 rust/iced 作为一个 GUI 框架它足够简单!

[1]:
看看这种小众语言的 GUI 框架,它往往提供了最本质的东西,在一个足够简单的框架里。

[2]:
关于 “不复杂”

在进行 GUI 理念研究时候,一个不复杂的框架是必要的。不复杂的必要性是:

不复杂,但足以让一个 app 被开发出来。相比那些成熟语言的成熟框架,它仅仅做到了 “提供足够用的”:好处一 它没提供 “多余的概念 / 跑题的概念”( eg 各种 web 前端框架都有自己的一堆概念),好处二 它也没提供 “多余的实现 / 虽然没跑题但弄得很复杂” ( eg 各种 C# GUI Java Swing JavaFX 都有足够的多余的实现 比如 关于多线程的实现)

[3]:
只有足够简单的东西才能让人去研究理念。否则只能招来学阀,用一堆不相干的概念把人砸蒙 ... 一个足够简单的东西才能拯救信息过载
kokutou
2022-11-16 08:48:59 +08:00
qt creator 一把梭
kujio
2022-11-16 08:50:25 +08:00
一般都是语言本身或者框架通过某一个 2D 图形渲染器 封装一些常用的组件。比如 button ,text 等等,然后根据抽象的布局代码 把这些组件放到指定位置。GUI 实际开发的精细度拖拖拽拽目前我见过的都不好用,在一个长长的列表里寻找想要设置的属性,远远没有敲几个关键字就能自动补全快和精准。更何况工作中因为业务问题需要大量自绘组件,当然 op 应该是不熟悉这种抽象方式,目前 gui 主流就命令式和声明式,命令式更容易理解,声明式更直观
kujio
2022-11-16 08:53:32 +08:00
@charlie21 iced 目前还不支持非拉丁系的语言好像,前段时间刚好有研究过
yzld2002
2022-11-16 09:11:43 +08:00
有人试过 kotlin compose 么?
zjsxwc
2022-11-16 09:18:35 +08:00
我对 Gtk 了解比较多,9 年前大学毕业设计也是用 Gtk 做的 GUI 。
最开始我用[Glade]( https://glade.gnome.org/ )这种托拽生成 xml 的方式来弄界面,

后来搞 web 开发后我就很喜欢 mvvm 这种数据与 ui 双向绑定的方式,
Gtk 也有这种 mvvm 开发方式,我比较推荐基于 rust 的[relm]( https://github.com/antoyo/relm ) 框架,它就是在原生 Gtk 上加了点 mvvm 机制,对于了解 Gtk 的开发者来说上手很快很顺滑。

总结:不管是之前 IDE 托拽界面的方式,还是老的手动编码布局方式,本质上就和 jQuery 搞前端界面一样,要处理界面回调要手动更新显示,对于复杂点的交互逻辑就很繁琐不好维护。
而使用 mvvm 方式的 ui 开发就决定了,它用编码方式比托拽界面更自然方便,所以同样基于托拽的安卓开发也很难使用 mvvm 方式来开发 ui 。
zxCoder
2022-11-16 09:26:58 +08:00
1. GUI 现在不流行
2. 需要 GUI 的场景不重视界面
->
3. 靠谱的 GUI 库少,界面设计不方便
zxCoder
2022-11-16 09:27:09 +08:00
这有啥好困扰的
wangxiaoaer
2022-11-16 09:41:48 +08:00
@helone #13 这个 aardio 到底是何方神圣,听起来很厉害的样子? 原理是什么?看起来也比易语言这种正常点儿?
kujio
2022-11-16 09:55:20 +08:00
@yzld2002 试过,安卓方面很多库都开始支持 jetpack compose 了,kotlin desktop 方面目前只是个半成品,做安卓开发的可以了解一下,其他的我建议不如学 flutter
ungrown
2022-11-16 09:59:08 +08:00
@faketemp #7 醒醒,阅读理解就是做题做废的
faketemp
2022-11-16 10:02:36 +08:00
@fansvista
一句话,都是"业务场景"给逼的

需要开发内部工具给大家用 面对的是上至五六十下至二三十的人群 知道命令行的估计不足 3%;每人的系统也不同优麒麟 /xp/win7 各种;内网又不能随便安装 dotnet/jdk 等什么运行时

除了 Golang ,问天下百家编程语言,还有几个能不依赖运行时、跨系统编译支持同时又兼顾开发效率的存在??

所以选 Golang 写了几款发现 Cli 程序自己用着爽、教人用熟难——想找个 GUI 库套上用用,才有上贴一问……

自己业余用用玩下,所以才想知道 V 站"专业程序员"生产环境中到底是如何高效开发和维护 GUI 程序???

顺便一提:
看回帖发现个别网友的阅读理解确实需要多练几个题[狗头]
ChrisFreeMan
2022-11-16 10:20:42 +08:00
难道只有我一个人很讨厌写 GUI 需要界面拖拖拽拽吗,感觉就像在 P 图一样。😅
xdeng
2022-11-16 10:22:17 +08:00
拖控件的方法是比较低级的,做不了复杂的界面。
seers
2022-11-16 10:25:45 +08:00
我尝试了很多,最后还是 go+浏览器 b/s 最方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX