同事们,您好!
几个月前,我开始研究Golang,目标是将其用于桌面应用程序。 我喜欢这种语言的语言,为它编写的软件包的数量和主题都给人留下了深刻的印象,但是GUI的情况并不是那么乐观。 现在,我不再赘述,只需阅读一些评论并快速浏览现有的GUI软件包,我便决定编写自己的软件包,特别是因为我有丰富的经验。
我的第一个想法是走一条破旧的道路:用C编写一组相应的函数,或者改编一个已经准备好的函数-我曾经为Harbor和C ++编写的函数,使用cgo(用于Golang的C API)绑定到它,然后友好的包装。 我什至开始做这件事,收到了第一个窗口,但是正如我想象的那样,分别针对Windows,Linux和纯技术工作仍需要进行大量工作,因为我已经经历了它,所以我的热情有所降低。
然后另一个想法来了。
我已经有一个GUI库HwGUI for Harbor,该库功能非常强大,可以跨平台使用,我经常在我的应用程序中使用它。 我需要的一切都已经实现了。 为什么不基于它编写可用作GUI服务器的程序呢? 启动此服务器后,它将静静地监听特定的端口,并且在收到我的Golang程序的连接后,它将创建窗口,窗口小部件以响应其请求,对其进行操作并在出现窗口小部件中的任何事件时提供反馈-简而言之,为此实现一个GUI。 对于Windows,GUI实现的所有低级详细信息都已经在库中(通过直接调用WinAPI),对于Windows / Linux和Unix(可能是macO)(通过GTK)。 另外,我无意使服务器成为一个完整的词,它不会接受来自不同程序的连接-这会带来其他不必要的困难。 对于Golang程序的每个实例,将启动GUI服务器的单独实例,这进一步简化了任务。 因此,一般而言,该程序将由两个进程组成,其中一个执行主要任务,另一个负责接口。
Go的相应软件包应包括Init过程(用于启动GUI服务器并将其连接),以及用于创建窗口和小部件并对其进行操作的一组结构,方法,函数。 所有这些功能的主要内容是将某种格式的消息(基于JSON)发送到服务器,并从服务器接收消息。 使用两个tcp / ip端口支持通信,一个端口负责向服务器发送请求,另一个端口负责从服务器接收信号以进行事件处理(按下按钮,关闭窗口等)。 任务比较简单,包装本身很小。 无需使用cgo,无需绑定到第三方库,所有代码均以纯Go编写。 程序本身的可执行文件和GUI服务器的可执行文件都是。
对我来说,选择Harbor + HwGUI来实现GUI服务器主要是因为这些是我的“本机”工具,是最简单,最快的解决方案。 但是从其他角度来看,这是一个不错的选择。 我认为这是主要优点:
- 跨平台的“在盒子里”;
- 所谓的本机外观,因为在Windows下,它仅是WinAPI调用,在Linux / Unix-GTK下; 我真的不知道macO的“本地” GTK有多少;
- 使用港湾作为内置脚本语言的能力,您可以将代码片段执行以传输到服务器-例如事件处理程序,它可以从一些实现细节中卸载主程序。 另外,Harbor在很多方面都有好处,例如,使用dbf和某些数据库。
- 印刷实施;
- 使用设计器创建的屏幕表单的功能(HwGUI实用程序)。 这些表格以XML格式存储,可以在不运行服务器的任何操作系统中使用而无需更改。
- 可以使用由同一设计者创建的报表进行打印(也可以使用XML)。
简而言之,我开始这样做,并且很大一部分工作已经完成。 GuiServer和Golang外部GUI框架这两个项目都在Github上,所有链接都在本文的结尾。 以下是几个屏幕截图。 没什么特别的,只是测试。
这是一个简单的对话框:
这是根据Kernigan和Donovan的书中的示例完成的:
现在,这些项目的主要目标是确保这对甜蜜的情侣,External和GuiServer,能够完成HwGUI可以做到的一切。 好了,在使用外部创建一些实际的应用程序的过程中,很明显,还需要什么。
到此为止,我又推迟了对Golang软件包的描述。 但是本文的主要内容才刚刚开始。 毕竟,所描述的用于用同一GUI服务器实现GUI框架的方法可以用于其他语言。 C,Python,Java,...,甚至Perl和PHP(为什么不呢?)-请参见文章标题。 最低成本-且功能相当的GUI解决方案已准备就绪。 对于每种特定语言而言,最困难的不是与服务器进行交换,而是使该解决方案有机地适应其范式和内部逻辑。 如果有人想为他们的语言创建这样的框架,我将尝试提供所有可能的帮助,以获取必要的信息,并可能向GUI服务器添加一些功能。
与Golang软件包同时,我为Harbor创建了一个模拟,主要用于验证/调试目的。 我不太可能为Perl建立框架,但对于C或C ++来说,这很有可能。 原因如下:毕竟,还有另一个与GUI服务器的使用有关的有趣功能,它可以在另一台计算机上运行。 主程序在一台计算机上运行,其接口在另一台计算机上运行。 立即可以看到使用这种情况的选项:
- 主程序运行在完全不安装图形外壳的Linux / Unix服务器上;
- 主程序在其他人的计算机上运行(在您公司中有一名条件会计师),您可以在不干涉的情况下自行管理该程序;
- 主程序运行在智能手机上,您可以从普通计算机上深入研究其内部;
- 主程序在控制器上运行,在某些Arduino,Raspberry或它们对应的控制器上,可能没有正常的监视器。 与您的笔记本电脑连接-继续。
好吧,对于最后一种选择,GUI服务器的C框架可能会很有用,我认为这种可能性非常有前途。
最后,链接:
github.com/alkresin/guiserver-Github上的 GuiServer
github.com/alkresin/external-Github上的 External(Go package)
www.kresin.ru/guisrv.html-我网站上的
GuiServer页面,您可以在这里下载现成的二进制文件
habr.com/post/198618-我关于港口的文章在哈布雷
en.wikipedia.org/wiki/Harbor-维基百科上的港口
www.kresin.ru/harbour.html-我的网站上的港口网页
www.kresin.ru/hwgui.html-我网站上的HwGUI页面
PS:很明显,很少有人会安装Harbor和HwGUI从源代码构建GuiServer,所以我定期将收集的二进制文件发布到我网站的GuiServer页面上-适用于Windows,Debian 8 32位,Ubuntu 18.04 64位。 我可以组装Fedora,但在macO下-a,我不在步行范围内。