我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GoUI:一个非常简单的 GUI 框架

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GoUI:一个非常简单的 GUI 框架

[[344583]]

以前,我曾将 Ebiten 图形库用于 Go,以便与孩子们一起编写一些游戏。但是,对于一般的“应用程序”开发(即需要“小部件 widgets”,例如按钮,菜单等),Ebiten 并非真的适合。因此,我一直在寻找可以使用的 Go UI 库。然而大多数都使用 cgo,但我真的希望我的应用程序是纯 Go。这纯粹是个人喜好,我不知道使用 cgo 而不是纯 Go 会有什么影响。如果我要使用 cgo,我认为首选的 UI 库肯定是 Fyne[1]。Fyne 看起来是一个非常全面的框架,如果您不介意 cgo,我绝对会建议你看看看 Fyne。

还有其他一些库,但没有吸引我。他们说你永远不应该编写自己的安全性代码,并且我也相信你不应该编写自己的 UI 库。但是我忽略了这个建议...

因此,我写了一个 GoUI[2] !!

这纯粹是那些“抓痒”的项目之一。虽然现在还很早,但 UI 库的基本知识(由 Ebiten 进行实际渲染)正在慢慢融合。在详细介绍下面细节之前,我想先说明一下,我认为程序在 CLI 达到了顶峰。其次,我不是 UI 编程人员……写这些是我个人的兴趣。

GoUI 的基本思想是两种类型的图形元素。一个是可以包含其他面板或小部件的面板(Panel)。另一个是小部件,它是基本的 UI 元素(按钮,文本输入等)。我们目前使用的面板类型有 HPanel(水平添加)和 VPanel(我让你猜)。从技术上讲,我们确实有其他面板,例如工具栏,但这实际上只是 HPanel,需要一点点定制工作。总体而言,如果我可以结合其他现有面板/小工具来构造一些“新”东西,那么我会做的。如果我需要优化或与已有产品脱节,那么我将做一些全新的事情。

我们目前拥有的小部件是:

  • ImageButton:(由应用程序提供的单击/未单击的图像)。
  • TextButton:基本的彩色矩形,其中包含您想要的任何文本。
  • Checkbox:与 TextButton 相同,但是旁边有一个小方框,可以打对勾。
  • EmptySpace:完全由我控制。用于强制其他小部件之间的空间。一旦添加适当的填充,该填充可能会消失。
  • Label:文本标签,不能输入。
  • Text Input:文本输入框。
  • RadioButtonGroup:这是一个面板,其中包含 vpanel 或 hpanel(取决于标志),然后其中包含许多复选框。复选框将图像(带有刻度)替换为常规的单选按钮。这是重新使用现有窗口小部件的好例子。如果事实证明我需要对复选框进行足够的修改以使其不适合用作单选按钮,那么我将不得不放入一个真正的单选按钮。但是目前,它运行良好。

我还没有完成菜单,模态窗口等,但是正如我所说的……这还是早期。

现在,让我们尝试一个超级简单的 Demo。

  1. package main 
  2.  import ( 
  3.     "github.com/hajimehoshi/ebiten" 
  4.     "github.com/kpfaulkner/goui/pkg" 
  5.     "github.com/kpfaulkner/goui/pkg/widgets" 
  6.     log "github.com/sirupsen/logrus" 
  7.     "image/color" 
  8. ) type MyApp struct { 
  9.     window pkg.Window} func NewMyApp() *MyApp { 
  10.     a := MyApp{}    a.window = pkg.NewWindow(800, 600, "test app"falsefalse
  11.     return &a 
  12. } func (m *MyApp) SetupUI() error { 
  13.     vPanel := widgets.NewVPanel("main vpanel", &color.RGBA{0, 0, 0, 0xff}) 
  14.     m.window.AddPanel(vPanel)    button1 := widgets.NewTextButton("text button 1""my button1"true, 0, 0, nil, nil, nil, nil) 
  15.     vPanel.AddWidget(button1)    return nil 
  16. } func (m *MyApp) Run() error { 
  17.     m.SetupUI()    ebiten.SetRunnableInBackground(true
  18.     ebiten.SetWindowResizable(true
  19.     m.window.MainLoop()    return nil 
  20. } func main() { 
  21.     log.SetLevel(log.DebugLevel)    app := NewMyApp()    app.Run()} 

让我们解释一下以上代码。

首先,该程序的核心仍然是直接调用 Ebiten。这些尚未封装。因此,你将在 main 和 Run 函数中看到,我们基本上已经制作了 MyApp 结构的实例,然后调用 SetupUI,设置一些 Ebiten 标志,然后调用 MainLoop。

NewMyApp 函数调用 pkg.NewWindow 函数。这是应用程序的主窗口。一旦添加了模态/其他窗口,这可能会更改,但是就目前而言,这将创建给定大小的主 UI 窗口。

SetupUI 是你需要注意的地方。我们要做的第一件事是创建一个 VPanel。请记住,VPanel 把小部件垂直堆叠放置。我们将 vPanel 添加到主窗口。实际上(当前),我们应该只在主窗口中添加 1 个面板,其他所有内容都应放入该面板中。因此,在这种情况下,我们创建 button1(新的 TextButton)并将其添加到 vPanel。

 

花点时间来学习理解一下上面的 UI 技能。

下面,让我们做一些更有趣的事情。假设我们要在按下按钮时做出响应。创建 TextButton 的行是:

  1. button1 := widgets.NewTextButton("text button 1""my button1"true, 0, 0, nil, nil, nil, nil) 

所有细节就不描述了,但是最后一个参数是带有 func (event IEvent) error签名的事件处理程序。因此,如果我们创建一个带有该签名的方法,并将其作为最后一个参数传递给 NewTextButton。

  1. func (m *MyApp) ButtonAction1(event events.IEvent) error { 
  2.     log.Debugf("My button1 action 1!!!"
  3.     return nil 

然后我们将按钮创建修改为

  1. button1 := widgets.NewTextButton("text button 1""my button1"true, 0, 0, nil, nil, nil, m.ButtonAction1) 

现在,当单击按钮时,将调用 ButtonAction1 函数,我们可以触发所需的任何功能。

是不是很简单。

现在,如果我想要在按钮旁边放点东西该怎么办?我们在这里要做的是创建一个 HPanel,并将其首先放入 VPanel。然后,将按钮添加到 HPanel。如果这样做,我们最终将得到如下代码:

  1. func (m *MyApp) SetupUI() error { 
  2.      vPanel := widgets.NewVPanel("main vpanel", &color.RGBA{0, 0, 0, 0xff}) 
  3.     m.window.AddPanel(vPanel) 
  4.      hPanel := widgets.NewHPanel("hpanel1", &color.RGBA{0, 100, 0, 255}) 
  5.     vPanel.AddWidget(hPanel) 
  6.      button1 := widgets.NewTextButton("text button 1""my button1"true, 0, 0, nil, nil, nil, m.ButtonAction1) 
  7.     hPanel.AddWidget(button1) 
  8.      return nil} 

从视觉上看,什么都不会改变。我们仍然只显示 1 个小部件。

现在,如果我们在同一 HPanel 中添加一个复选框怎么办?

  1. func (m *MyApp) SetupUI() error { 
  2.      vPanel := widgets.NewVPanel("main vpanel", &color.RGBA{0, 0, 0, 0xff}) 
  3.     m.window.AddPanel(vPanel) 
  4.      hPanel := widgets.NewHPanel("hpanel1", &color.RGBA{0, 100, 0, 255}) 
  5.     button1 := widgets.NewTextButton("text button 1""my button1"true, 0, 0, nil, nil, nil, m.ButtonAction1) 
  6.     hPanel.AddWidget(button1) 
  7.      cb1 := widgets.NewCheckBox("my checkbox1""check me please""""", nil) 
  8.     hPanel.AddWidget(cb1) 
  9.      vPanel.AddWidget(hPanel) 
  10.     return nil} 

因此,与之前完全相同,但只有这额外的两条:创建复选框,然后添加到 hPanel。

现在 UI 看起来是这样:

 

现在不担心这里的间距了。

现在让我们在 TextButton 下面添加一个 ImageButton。这意味着我们将向 vPanel 添加第二项(第一项是 hPanel)

  1. imageButton := widgets.NewImageButton("ib1""images/pressedbutton.png""images/nonpressedbutton.png",nil ) 
  2. vPanel.AddWidget(imageButton) 

这是效果如下:

 

这时,我们有了 2 张图片(屏幕截图中只显示了一张)。按下按钮时一个,不按下时一个(只更改了阴影)。懂了吧。

好了,介绍就这么多。虽然该 UI 库还不完善,但 GUI 的基本功能已经可以实现了。再次放上该库的地址:https://github.com/kpfaulkner/goui。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GoUI:一个非常简单的 GUI 框架

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GoUI:一个非常简单的 GUI 框架

最近,我一直想开发一些桌面(主要是 Windows,但也可以考虑 MacOS 或 Linux)应用程序。虽然 Go 不是开发 UI 应用程序时首选语言,但是该语言的简单性和健壮性仍然使它成为我的首选语言。是的,这是我的锤子(hammer).

分享一个简单的java爬虫框架

反复给网站编写不同的爬虫逻辑太麻烦了,自己实现了一个小框架可以自定义的部分有:请求方式(默认为Getuser-agent为谷歌浏览器的设置),可以通过实现RequestSet接口来自定义请求方式储存方式(默认储存在f盘的html文件夹下),
2023-05-30

如何用Python写一个简单的Web框架

如何用Python写一个简单的Web框架,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概述在Python中,WSGI(Web Server Gateway
2023-06-17

python实现一个简单的web应用框架

这篇文章主要为大家介绍了使用python写一个简单的web应用框架实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

Go语言Http Server框架实现一个简单的httpServer

这篇文章主要为大家介绍了Go语言Http Server框架实现一个简单的httpServer抽象,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

非常简单的Android打开和保存对话框功能

在Android上没有标准的打开和另存为对话框。在本代码中,我将详细描述一个非常简单的打开和保存对话框实现过程,对于Android初学者来说非常有用,对话框都是全屏活动的。 主要功能: 1、访问任何目录的SD卡 2、递归访问文件夹 3、单一
2022-06-06

Qwik简介:一个超快的JavaScript框架

Qwik对代码拆分和延迟加载的创新方法为前端JavaScript提供了一种新的发展方式。本文将对Qwik进行简要介绍。

一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel

MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB

如何在Python中实现一个简单的RPC远程过程调用框架

如何在Python中实现一个简单的RPC远程过程调用框架在分布式系统中,一种常见的通信机制是通过RPC(Remote Procedure Call,远程过程调用)来实现不同进程之间的函数调用。RPC允许开发者像调用本地函数一样调用远程函数,
2023-10-27

一个更简单的字节码增强框架,谁看了案例都会使用!

Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。除了 Java 类库附带的代码生成实用程序外,Byte Buddy 还允许创建任意类,并且不限于实现用于创建运行时代

Python爬虫基础之简单说一下scrapy的框架结构

scrapy 框架结构 思考scrapy 为什么是框架而不是库scrapy是如何工作的项目结构 在开始爬取之前,必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:注意:创建项目时,会在当前目录下新建爬虫项目的目录。
2022-06-02

前端新一代框架 Svelte 火了!十个场景带你简单认识它!

父组件里面,Svelte中提供了{}这样的语法糖,去支持父组件传值到子组件中,且类型一定要符合子组件中定义的类型,不然会报类型错误。

详解如何实现一个简单的Node.js脚手架

原因在工作中,需要开发一个脚手架,用于给相关用户提供相关的开发便利性。 适合人群对前端、Node操作有一定的了解,同时向了解脚手架开发过程或者需要自己实现一个脚手架的开发者。 目标开发一个简单的脚手架,能够提供给用户进行安装。能够输出相关提
2022-06-04

每天学习一个Android中的常用框架——1.Litepal

文章目录1.简介2.特性3.演示3.1 集成3.2 配置3.3 创建数据库3.4 升级数据库3.5 插入数据3.6 查询数据3.7 更新数据3.8 删除数据4.版本异同5.源码地址 1.简介 Litepal——作为带我入行的第一本教学书籍《
2022-06-06

每天学习一个Android中的常用框架——5.Retrofit

文章目录1.简介2.特性3.演示3.1 集成3.2 配置3.3 布局文件和URL封装3.5 GET请求——传统网络参数3.6 GET请求——RestFul风格3.7 POST请求4.源码地址 1.简介 在介绍Android中相关网络框架的时
2022-06-06

每天学习一个Android中的常用框架——4.OkIo

文章目录1.简介2.特性3.演示3.1 集成3.2 配置3.3 布局文件和URL封装3.4 POST请求提交键值对3.5 POST请求提交字符串3.6 POST请求提交文件3.7 POST请求提交表单4.源码地址 1.简介 在上一篇博客中,
2022-06-06

速速收藏!9个非常受欢迎的开源自动化测试框架盘点

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能,安全性,可用性和可访问性。

从一个简单 API 的发布到组件化的架构思考

在 SaaS 版本的零代码平台中,高级用户希望能上传自己编写的 WebAPI ,来实现一些复杂场景下的业务。就需要添加可以通过上传程序包进行发布部署的功能。
WebAPI架构2024-12-02

OccFusion:一种简单有效的Occ多传感器融合框架(性能SOTA)

本文介绍了OccFusion,这是一种简单高效的传感器融合框架,用于预测3D占用率。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录