Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 从一组代码中同时打开两个相同的窗口_User Interface_Go_Andlabs Ui - Fatal编程技术网

User interface 从一组代码中同时打开两个相同的窗口

User interface 从一组代码中同时打开两个相同的窗口,user-interface,go,andlabs-ui,User Interface,Go,Andlabs Ui,我使用以下代码创建并显示一个窗口,其中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 gree

我使用以下代码创建并显示一个窗口,其中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)
    // HOW TO CREATE AND SHOW ANOTHER SUCH WINDOW HERE ?
    // ui.Main(makewinfn) // this opens window only after first is closed.
}
它工作得很好,但正如我在标题中提到的,以及上面代码中的注释,如何从main函数同时打开两个这样的窗口

在main函数中重复ui.Mainmakewinfn只会在第一个窗口关闭后打开第二个窗口


谢谢您的帮助。

我不知道该怎么办,但假设GUI与我使用的任何其他语言一样工作,在makewinfn函数中,您只需再次调用ui.NewWindow即可创建更多窗口


在UI库中,通常构建接口的组件或小部件都有父级,通常单个组件最多只能有一个父级

因此,如果您想要两个具有相同组件的窗口,您仍然必须在两个实例中创建这些组件,因为无法将组件添加到两个不同窗口中的两个不同父窗口

最简单的方法是将组件和窗口创建逻辑移动到一个函数中,并从传递到ui的函数中调用该逻辑两次。Main:

当然,使用这个createWindow函数不是必需的,您可以在makewinfn中有一个循环,每个循环有2次迭代,每次迭代都可以创建一个窗口

上面的示例创建了两个相同的窗口,但它们是独立的。如果在其中一个窗口中输入文本并单击其按钮,则结果将仅在其包含/父窗口中显示。这是可能的,因为每个组件都创建了两次

如果要自定义窗口,可以将参数传递给createWindow,以便根据其值对窗口及其内容进行自定义/个性化。例如:

func createWindow(id string) {
    var name = ui.NewEntry()
    var button = ui.NewButton("Greet " + id)
    var greeting = ui.NewLabel("")
    box := ui.NewVerticalBox()
    box.Append(ui.NewLabel("Enter your name " + id + ":"), false)
    box.Append(name, false)
    box.Append(button, false)
    box.Append(greeting, false)
    mywindow := ui.NewWindow("MyTitle " + id, 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 makewinfn() {
    createWindow("one")
    createWindow("two")
}

从代码中可以很清楚地看出,ui.NewWindow是创建新窗口的调用。复制ui.Main我认为是一个错误,我希望它与Main类似,即在启动时只调用一次。我尝试了func makewinfn*ui.NewWindow{因此它返回窗口对象,但错误是:*ui.NewWindow不是一个typeRight,它是一个函数,创建并返回一个新的窗口对象。您是否检查了此ui包的文档?窗口确实打开,但它是空的。我还必须将所有组件添加到myOtherWindow,这是代码的重复。我希望此函数to返回一个自定义窗口对象,我可以根据需要多次使用该对象。问题是Go没有类,因此如何获取此类对象。将该逻辑设置为自己的函数,并使用适当的参数调用它。如果您更改代码以显示该对象,这将非常好。太好了。是否可以将这两个窗口创建为对象,以便我可以从程序中的任何位置访问其名称输入字段?此外,当前关闭一个窗口会同时关闭和结束程序。如何只关闭该窗口而不结束程序?是的,这是可能的,您可以将窗口存储在包级别变量中,您在上一个问题中已经看到了如何执行此操作,并且ui.window有一个窗口。Title method因为这次你有多个窗口,你可以将它们存储在多个变量或一个切片中。如果你不想在窗口关闭时退出,你可以设置你自己的函数如何处理窗口关闭事件,请参阅window.OnClosing方法。设置一个不退出的函数或减小vi可接受的窗口计数,如果达到0,那么退出。太好了。知道我为什么在这个问题上得到这么多的反对票吗!?
func createWindow() {
    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 makewinfn() {
    createWindow()
    createWindow()
}
func createWindow(id string) {
    var name = ui.NewEntry()
    var button = ui.NewButton("Greet " + id)
    var greeting = ui.NewLabel("")
    box := ui.NewVerticalBox()
    box.Append(ui.NewLabel("Enter your name " + id + ":"), false)
    box.Append(name, false)
    box.Append(button, false)
    box.Append(greeting, false)
    mywindow := ui.NewWindow("MyTitle " + id, 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 makewinfn() {
    createWindow("one")
    createWindow("two")
}