从一组代码同时打开 2 个相同的窗口

我使用以下代码创建并显示一个窗口,其中包含 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 函数同时打开两个这样的窗口?


在主函数中重复会ui.Main(makewinfn)导致仅在第一个窗口关闭后才打开第二个窗口。


感谢您的帮助。


拉丁的传说
浏览 120回答 2
2回答

当年话下

在 UI 库中,通常您构建界面所用的组件或小部件都有父级,并且通常单个组件最多可能有一个父级。因此,如果您想要 2 个具有相同组件的窗口,您仍然必须在 2 个实例中创建这些组件,因为一个组件无法添加到 2 个不同的父级(在 2 个不同的窗口中)。最简单的方法是将组件和窗口创建逻辑移动到一个函数中,然后从传递给的函数中调用该函数两次ui.Main():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()}当然,使用这个createWindow()函数不是必需的,您可以有一个循环进行makewinfn()2 次迭代,每次迭代都可以创建一个窗口。上面的示例创建了 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")}

慕村9548890

我不知道 Go,但假设 GUI 的工作方式与我使用过的任何其他语言一样,在 makewinfn 函数中,您可以通过再次调用来简单地创建更多窗口ui.NewWindow()。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()    myOtherWindow := ui.NewWindow("MyOtherTitle", 200, 100, false)    myOtherWindow.Show()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go