0

我正在创建一个函数,该函数应该在 Lua 的 IUP 中执行某个函数后将元素显示到主窗口中。

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

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 来运行代码时,突然间,程序根本不会将元素显示到主窗口中,也不会在新窗口中显示:

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

然后最奇怪的是,当我将hrbox(我用来在主窗口中显示元素的框)完全变成一个单独的变量时,它并没有显示在主窗口中,而是显示在新窗口中。这是后来的代码:

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 元素的数组变量工作,以便它可以显示到主窗口中?我不知道该怎么做,在完成所有研究之后,我基本上被卡住了。

任何答案和建议表示赞赏。

提前致谢!

4

1 回答 1

1

我试图创建一个最小的可重现示例

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()

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

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

您在这段代码中有一个问题:

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. 孩子将在同一时间自动映射。打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()
于 2021-04-19T01:31:41.523 回答