如何将声明为 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()
我正在创建一个函数,该函数应该在 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()