为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
拉丁的传说 2023-07-10 17:39:12
我使用以下代码创建并显示一个窗口,其中包含 GUI 组件作为标签、条目和按钮:// modified from: https://github.com/andlabs/ui/wiki/Getting-Startedpackage mainimport ("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)导致仅在第一个窗口关闭后才打开第二个窗口。感谢您的帮助。
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

在 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")

}


查看完整回答
反对 回复 2023-07-10
?
慕村9548890

TA贡献1884条经验 获得超4个赞

我不知道 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()

}


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信