无法将 GUI 变量保持为全局变量

我发现以下代码有效:


// modified from: https://github.com/andlabs/ui/wiki/Getting-Started

package main

import ("github.com/andlabs/ui")

func makewinfn() {

    var name = ui.NewEntry()

    var button = ui.NewButton("Greet")

    var greeting = ui.NewLabel("")

    box := ui.NewVerticalBox()

    box.Append(ui.NewLabel("Enter your name:"), false)

    box.Append(name, false)

    box.Append(button, false)

    box.Append(greeting, false)

    mywindow := ui.NewWindow("MyTitle", 200, 100, false)

    mywindow.SetChild(box)

    button.OnClicked( func (*ui.Button) {greeting.SetText("Hello, " + name.Text() + "!") } )

    mywindow.OnClosing( func (*ui.Window) bool { ui.Quit(); return true } )

    mywindow.Show()

}

func main() {

    ui.Main(makewinfn)

}

但是,如果我尝试使用全局变量:


package main

import ("github.com/andlabs/ui")

// keeping following as global variables: 

var name = ui.NewEntry()

var button = ui.NewButton("Greet")

var greeting = ui.NewLabel("")

func makewinfn() {

    box := ui.NewVerticalBox()

    box.Append(ui.NewLabel("Enter your name:"), false)

    box.Append(name, false)

    box.Append(button, false)

    box.Append(greeting, false)

    mywindow := ui.NewWindow("MyTitle", 200, 100, false)

    mywindow.SetChild(box)

    button.OnClicked( func (*ui.Button) {greeting.SetText("Hello, " + name.Text() + "!") } )

    mywindow.OnClosing( func (*ui.Window) bool { ui.Quit(); return true } )

    mywindow.Show()

}

func main() {

    ui.Main(makewinfn)

}

这段带有全局变量的代码可以正常编译,但在运行时会产生以下错误:


fatal error: unexpected signal during runtime execution

[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x7fecb2712e19]

如何将 GUI 组件保留为全局变量?我将它们保留为全局,以便我可以从其他功能访问它们。


慕哥9229398
浏览 135回答 1
1回答

芜湖不芜

当您在顶层(包块)使用变量时,它们会在开始执行之前初始化main()。并且您从github.com/andlabs/ui包中调用代码,但它ui.Main()尚未被调用,因此ui它所依赖的包和资源可能尚未初始化。仅声明变量,但尚未为其赋值,将其留给函数makewinfn():var name *ui.Entryvar button *ui.Buttonvar greeting *ui.Labelfunc makewinfn() {    name = ui.NewEntry()    button = ui.NewButton("Greet")    greeting = ui.NewLabel("")    box := ui.NewVerticalBox()    // ...}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go