您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    GoUI:一个十分复杂的 GUI 框架
    时间:2020-09-29 21:06 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    最近,我不断想开发一些桌面(主要是 Windows,但也可以思索 MacOS 或 Linux)运用顺序。虽然 Go 不是开发 UI 运用顺序时首选言语,但是该言语的复杂性和强健性依然使它成为我的首选言语。是的,这是我的锤子(hammer)... 但这是一个该死的美丽锤子。

    GoUI:一个十分复杂的 GUI 框架

    以前,我曾将 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。

    package main 

     import ( 

        "github.com/hajimehoshi/ebiten" 

        "github.com/kpfaulkner/goui/pkg" 

        "github.com/kpfaulkner/goui/pkg/widgets" 

        log "github.com/sirupsen/logrus" 

        "image/color" 

    ) type MyApp struct { 

        window pkg.Window} func NewMyApp() *MyApp { 

        a := MyApp{}    a.window = pkg.NewWindow(800, 600, "test app"falsefalse

        return &a 

    } func (m *MyApp) SetupUI() error { 

        vPanel := widgets.NewVPanel("main vpanel", &color.RGBA{0, 0, 0, 0xff}) 

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

        vPanel.AddWidget(button1)    return nil 

    } func (m *MyApp) Run() error { 

        m.SetupUI()    ebiten.SetRunnableInBackground(true

        ebiten.SetWindowResizable(true

        m.window.MainLoop()    return nil 

    } func main() { 

        log.SetLevel(log.DebugLevel)    app := NewMyApp()    app.Run()} 

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

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

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

    (责任编辑:admin)