我发现以下代码有效:
// 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 组件保留为全局变量?我将它们保持为全局,以便我可以从其他功能访问它们。
最佳答案
当您在顶层(包 block )使用变量时,它们会在 main()
开始执行之前被初始化。
你从 github.com/andlabs/ui
包中调用代码,但是它的 ui.Main()
还没有被调用,所以 ui
依赖的包和资源可能还没有初始化。
只声明变量但还没有给它们赋值,把它留给makewinfn()
函数:
var name *ui.Entry
var button *ui.Button
var greeting *ui.Label
func makewinfn() {
name = ui.NewEntry()
button = ui.NewButton("Greet")
greeting = ui.NewLabel("")
box := ui.NewVerticalBox()
// ...
}
关于user-interface - 无法将 GUI 变量保持为全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477945/