如何将声明为 vbox/hbox 的数组显示到 main window 中?

How to display arrays declared as vbox/hbox into main window?

我正在创建一个函数,该函数应该在 Lua.

的 IUP 中执行某个函数后将元素显示到 Main window 中

问题是每当我 运行 vbox/hbox 没有数组的函数时,程序都会正常显示 GUI 元素(在这个测试用例中,一个文本框)。我还通过在新的 window 上显示这个来测试它,这也有效。这是我使用的普通代码:

function wa()
    local txt = {}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(hrbox, txt[1])
    iup.Map(txt[1])
    iup.Refresh(hrbox)
end

但是当我 运行 通过将数组变量声明为 hbox/vbox 到函数中的代码时,突然,程序不会将元素显示到主 window , 也不在新 window, 根本:

function wa()
    local txt = {}
    local a = {}
    a[1] = iup.vbox{}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(a[1], txt[1])
    iup.Map(txt[1])
    iup.Refresh(a[1])
    iup.Append(hrbox, a[1])
    iup.Refresh(hrbox)
end

然后 st运行 最重要的事情是,当我将 hrbox(我用来将元素显示到主 window 中的框)完全放入一个单独的变量时,它不显示它在主 window 中,但它确实显示在新 window 中。这是之后的代码:

function wa()
    local txt = {}
    hrbox = iup.hbox{}
    a = {}
    a[1] = iup.vbox{}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(a[1], txt[1])
    iup.Map(txt[1])
    iup.Refresh(a[1])
    iup.Append(hrbox, a[1])
    iup.Refresh(hrbox)
end

如何使声明为 hbox/vbox 元素的数组变量起作用,以便它可以显示在主 window 中?我不知道该怎么做,在进行了所有研究之后,我基本上被困住了。

如有任何答案和建议,我们将不胜感激。

提前致谢!

我尝试创建 a minimal reproducible example:

local iup = require("iuplua")

local Button = iup.button{TITLE="Add"}
local hrbox  = iup.vbox{Button}
local Frame  = iup.dialog{hrbox,SIZE="THIRDxTHIRD"}

function wa()
    local txt = {}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(hrbox, txt[1])
    iup.Map(txt[1])
    iup.Refresh(hrbox)
end

Button.action = function (Ih)
  wa()
end

Frame:show()
iup.MainLoop()

所以,基本上,您的代码工作正常。请确保在 wa.

上方声明 hrbox

编辑:我终于明白你的问题了

您在这段代码中遇到问题:

function wa()
    local txt = {}
    local a = {}
    a[1] = iup.vbox{}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(a[1], txt[1])
    iup.Map(txt[1])
    iup.Refresh(a[1])
    iup.Append(hrbox, a[1])
    iup.Refresh(hrbox)
end

您实际上需要 map 新创建的 hbox。 children 将同时自动映射。调用 refresh 一次就够了。

local iup = require("iuplua")

local Button = iup.button{TITLE="Add"}
local hrbox  = iup.vbox{Button}
local Frame  = iup.dialog{hrbox,SIZE="THIRDxTHIRD"}

function wa()
    local txt = {}
    local a = {}
    a[1] = iup.vbox{}
    txt[1] = iup.text{
      multiline = "NO",
      padding = "5x5",
      size="100x15",
      scrollbar="Horizontal",
    }
    iup.Append(a[1], txt[1]) -- Append the text to the new-box
    iup.Append(hrbox, a[1])  -- Append the new-box to the main box
    iup.Map(a[1])            -- Map the new-box and its children
    iup.Refresh(hrbox)       -- Re-calculate the layout
end

Button.action = function (Ih)
  wa()
end

Frame:show()
iup.MainLoop()